while …; do
echo "$fname" >&1
done > logfile
A saída padrão do comando echo
é redirecionada para sua saída padrão. Em outras palavras, >&1
é um não-op. O 1
em >&1
designa o descritor de arquivo 1 do comando em que ele é usado, não de algum escopo externo misteriosamente escolhido.
Para redirecionar para um arquivo que está disponível em um escopo externo, duplique o descritor de arquivo nesse escopo externo e não redirecione o descritor de arquivo duplicado.
while read fname fpath dname dpath; do
echo "$fname" >&3
echo "$fpath"
echo "$dname"
echo "$dpath"
diff "$fpath/$fname" "$dpath/$dname" >&3
done 3>&1 >logfile
Observe a ordem dos redirecionamentos no loop: primeiro crie um descritor de arquivo 3 que vá para onde o descritor de arquivo 1 (saída padrão) está indo atualmente e, em seguida, redirecione o descritor de arquivo 1 para outro lugar.
Alternativamente, você pode abrir o arquivo de log em um descritor diferente.
while read fname fpath dname dpath; do
echo "$fname"
echo "$fpath" >&3
echo "$dname" >&3
echo "$dpath" >&3
diff "$fpath/$fname" "$dpath/$dname"
done 3>logfile