Eu estava brincando com um script que envia texto para um tmux stdin após esta resposta ( https://unix.stackexchange.com/a/773049/189571 por @Kamil Maciorowski) e estava fazendo isso de forma errada
tty=$(tmux new-session -d -s aux -PF "#{pane_tty}")
echo -n foo > $tty && tput cr > $tty && echo bar > $tty
tmux capture-pane -t aux -p -S0 -E3
o que resulta em foo PROMPT %> bar
(sequenciado indeterminadamente e PROMPT é impresso)
enquanto o mesmo, mas usando o comando tail -f /dev/null
como argumento de tmux new-session, como sugeriu Kamil, dá bar
como resultado, que é o que eu esperava
Gostaria de entender por que sem cauda tudo falha. Aqui não é tail -f /dev/null
uma espécie de sleep infinity
? Qual é a diferença em não passar nenhum comando? Quero dizer, se você não passar nada para a nova sessão, o painel será mantido ativo até a sessão de eliminação também
tmux new-session
com um comando inicia o comando em um novo painel tmux em uma nova janela tmux em uma nova sessão tmux.tmux new-session
sem nenhum comando inicia um shell interativo.No seu caso,
PROMPT %>
é o prompt que esse shell imprime. Eu acho que sua linha comecho
s é executada imediatamente, então há uma condição de corrida e o prompt pode chegar ao tty (no painel) antesfoo
ou depoisbar
, ou entrefoo
ebar
.tput cr > $$tty
não imprimiu no tty desejado porque$$
foi expandido para o PID do shell que analisa a linha. Provavelmente você criou um arquivo normal chamado12345tty
ou algo assim, a saídatput
está dentro do arquivo.