Estou tentando entender a razão por trás da diferença nos redirecionamentos da saída do bash. Aqui estão duas abordagens:
- Redirecionamento da saída para o pipe nomeado:
/bin/bash -i 2>&1 1>/tmp/fifo
- Redirecionamento usando pipe sem nome para outro script lendo de stdin:
/bin/bash -i 2>&1 | ./reader.sh
reader.sh deve ler linha por linha do stdin:
while read LINE; do
echo ${LINE} # do something with it here
done
exit 0
A questão é: por que ao redirecionar para fifo (abordagem nº 1) as informações do prompt (nome de usuário@host: $) não são redirecionadas, mas ao redirecionar para outro programa/script (abordagem nº 2), elas são?
Porque quando você tem
left | right
, o shell se organiza para executar dois processos filhos com o stdout deleft
conectado ao stdin deright
, e depois disso, os filhos processam quaisquer redirecionamentos que eles tenham. Então emleft 2>&1 | right
, o stdout deleft
é primeiro redirecionado para o pipe, então o stderr deleft
é redirecionado para onde seu stdout vai, ou seja, o pipe.Em
something 2>&1 > file
, os redirecionamentos são processados da esquerda para a direita, então primeiro, stderr é redirecionado para onde stdout vai (provavelmente o terminal, então nenhuma alteração), então stdout é redirecionado parafile
.Então provavelmente você desejará trocar a ordem dos redirecionamentos.
Quando o bash é iniciado, ele tenta determinar se é interativo ou não, então ele executa a
isatty()
função.Da documentação do GNU bash :
/bin/bash -i 2>&1 1>/tmp/fifo
. Como o pipe nomeado não está conectado a nenhum tty, o bash assume que a sessão não é interativa e não envia informações de prompt.