Bash: La salida de un comando se escribe solo en la pantalla y no en otro archivo mientras se usa tee, ¿cuál podría ser el motivo?

Bash: La salida de un comando se escribe solo en la pantalla y no en otro archivo mientras se usa tee, ¿cuál podría ser el motivo?

Para solucionar algún error de conexión ftp, me han indicado que escriba un script bash que se conectará infinitamente a un servidor frp remoto y obtendrá un archivo desde allí.

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

El script funciona correctamente, pero se supone que la salida de la wgetlínea que se imprime en la pantalla también se envía teeal registro, pero por alguna razón no se escribe en el registro.

Ejemplo:

[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 =====------

¿Puede encontrar el motivo por el cual no está escrito en el registro?

Gracias de antemano,

Respuesta1

La razón es que aunque las echodeclaraciones van a STDOUTy, por lo tanto, se envían a través de la tubería a tee, la "salida" que estás viendo del wgetcomando está activada STDERR, lo cual no es así.

Esto no pasa por una tubería de forma predeterminada, sino que, como vio, en ttysu lugar. Si quieres enviarambos STDOUTy STDERRpara una tubería STDIN, deberías usar |&, por ejemplo

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

Eso funciona en bash y tcsh, si la memoria no me falla. Para los peces estándar de pantano es un poco más trabajo, pero aún se puede hacer (aunque no puedo recordar cómo).

Editar(por Anthony, cuyo comentario sigue; ¡gracias! - MadHatter):

La sintaxis para shells compatibles con POSIX (también debería funcionar para sh) sería:

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

información relacionada