Bash: A saída de um comando é gravada apenas na tela e não em outro arquivo ao usar tee, qual poderia ser o motivo?

Bash: A saída de um comando é gravada apenas na tela e não em outro arquivo ao usar tee, qual poderia ser o motivo?

Para solucionar alguns erros de conexão FTP, fui instruído a escrever um script bash que se conectará infinitamente a um servidor frp remoto e obterá um arquivo de lá.

ftpuser="ftpuser" 
ftppasswd="ftppasswd" 
ftpsrv="download.akamai.com" 
log="/var/log/test_ftp_akamai.log" 
function print_log { 
        echo $(date +'%d-%m-%y %H:%M:%S') $* >> $log 
} 

while true 
do print_log "-----===== Start =====------" | tee -a $log 
/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv | tee -a $log 
sleep 2 | tee -a $log 
print_log "-----===== Done =====------" | tee -a $log 
done

O script funciona corretamente, mas a saída da wgetlinha impressa na tela também deve ser teeinserida no log, mas por algum motivo ela não está sendo gravada no log.

Exemplo:

[root@sjorigin1 ~]# tailf /var/log/test_ftp_akamai.log 
25-02-15 02:10:31 -----===== Start =====------
25-02-15 02:10:33 -----===== Done =====------
25-02-15 02:10:33 -----===== Start =====------
25-02-15 02:10:35 -----===== Done =====------

Você consegue descobrir o motivo pelo qual não está gravado no log?

Desde já, obrigado,

Responder1

A razão é que, embora as echoinstruções vão para STDOUTe, portanto, sejam enviadas através do canal para tee, a "saída" que você vê do wgetcomando é on STDERR, o que não acontece.

Isso não passa por um cano por padrão, mas sim - como você viu tty. Se você quiser enviarambos STDOUTe STDERRpara um pipe STDIN, você deve usar |&, por exemplo

/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv |& tee -a $log

Isso funciona em bash e tcsh, se não houver memória. Para bog standard sh é um pouco mais trabalhoso, mas ainda pode ser feito (embora eu não consiga lembrar como).

Editar(por Anthony, cujo comentário segue; obrigado! - MadHatter):

A sintaxe para shells compatíveis com POSIX (também deve funcionar para sh) seria:

/usr/bin/wget ftp://$ftpuser:$ftppasswd@$ftpsrv 2>&1 | tee -a $log

informação relacionada