Bash:命令的输出只写到屏幕上,而不是在使用T恤时写入另一个文件,可能是什么原因?

为了解决一些ftp连接错误,我被指示编写一个bash脚本,它将无限连接到一个远程frp服务器并从那里获得一个文件。

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 

该脚本正常工作,但打印到屏幕上的wget行的输出也应该被logging到日志中,但由于某种原因,只有它不被写入日志。

例:

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

你能find它没有写入日志的原因吗?

提前致谢,

原因在于虽然echo语句转到STDOUT ,因此通过pipe道发送到tee ,但是从wget命令看到的“输出”在STDERR ,而不是。

这不会默认通过pipe道,正如你所看到的,改为tty 。 如果要将STDOUTSTDERR 发送到pipe道的STDIN ,则应使用|& ,例如

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

这在bash和tcsh,如果内存服务。 对于沼泽标准嘘这是一个更多的工作,但仍然可以完成(虽然我不能从我的头顶记住如何)。

编辑 (安东尼,其评论如下;谢谢! – MadHatter):

POSIX兼容shell的语法(也适用于sh )应该是:

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