Estou executando um script via ssh desta maneira:
ssh user@host 'bash -s' < ./script.sh
o problema é que, às vezes, a saída que recebo não está correta, as linhas são misturadas.
No meu caso, o script executa não muito novo, a saída normal é algo como:
...
Note: Ignoring non-mail file: foobar
Note: Ignoring non-mail file: foobar
Note: Ignoring non-mail file: foobar
Processed 93 total files in almost no time.
No new mail.
mas às vezes a saída é algo como:
...
Note: Ignoring non-mail file: foobar
Note: Ignoring non-mail file: foobar
Processed 93 total files in almost no time.
No new mail.
Note: Ignoring non-mail file: foobar
Note: Ignoring non-mail file: foobar
e com certeza essa não é a saída real de notmuch new
, o comando termina com, No new mail
mas é como se a saída fosse via ssh, não linha por linha.
Por que isso aconteceu?
linux
bash
ssh
shell-script
res1
fonte
fonte
Respostas:
Carregando. Se procurarmos o código fonte por
notmuch
Algumas dessas mensagens usam erro padrão (que é sem buffer por padrão) e algumas usam saída padrão (que é buffer de linha ou bloco por padrão, dependendo se a saída padrão é para um terminal ou um arquivo). Esse comportamento vem da biblioteca C padrão, consulte
setvbuf(3)
para obter detalhes. Assim, asstderr
mensagens são gravadas imediatamente, enquanto asprintf
chamadas parastdout
serão exibidas ... bem, depende.O buffer geralmente é configurado por cada aplicativo individualmente, embora talvez possa ser utilizado com utilitários como
stdbuf
(embora alguns considerem osLD_PRELOAD
truques usadosstdbuf
bastante horríveis ...).A diferença é fácil de reproduzir localmente; por exemplo, gravando no terminal (buffer baseado em linha para
stdout
):enquanto isso, se exatamente o mesmo código for redirecionado para um arquivo (buffer baseado em bloco para
stdout
):ssh
adiciona uma camada adicional de complicação, pois também é necessário descobrir como ele está coletando, armazenando em buffer e enviando bytes, além donotmuch
quessh
está conectado no sistema do cliente ...fonte
ssh
adicionadas.