Bash:使用 tee 時命令的輸出僅寫入螢幕而不寫入另一個文件,原因可能是什麼?

Bash:使用 tee 時命令的輸出僅寫入螢幕而不寫入另一個文件,原因可能是什麼?

為了解決一些 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也應該被tee寫入日誌,但由於某種原因,它沒有被寫入日誌。

例子:

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

能找到沒有寫入日誌的原因嗎?

先謝,

答案1

原因是,雖然echo語句轉到STDOUT,並因此通過管道發送到tee,但您從命令中看到的“輸出”wget是 on STDERR,但事實並非如此。

預設情況下,它不會通過管道,而是 - 正如您所看到的 - 而是通過管道tty。如果您想發送兩個都 STDOUT對於STDERR管道STDIN,您應該使用|&,例如

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

如果沒記錯的話,這在 bash 和 tcsh 中是有效的。對於沼澤標準 sh 來說,這需要更多的工作,但仍然可以完成(儘管我無法立即記住如何完成)。

編輯(安東尼的評論如下;謝謝!-MadHatter):

POSIX 相容 shell 的語法(也應該適用於sh)是:

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

相關內容