Bash: Die Ausgabe eines Befehls wird bei Verwendung von „tee“ nur auf den Bildschirm und nicht in eine andere Datei geschrieben. Was könnte der Grund sein?

Bash: Die Ausgabe eines Befehls wird bei Verwendung von „tee“ nur auf den Bildschirm und nicht in eine andere Datei geschrieben. Was könnte der Grund sein?

Um einige FTP-Verbindungsfehler zu beheben, wurde mir aufgetragen, ein Bash-Skript zu schreiben, das sich unendlich oft mit einem Remote-FRP-Server verbindet und von dort eine Datei abruft.

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

Das Skript funktioniert ordnungsgemäß, aber die Ausgabe der wgetauf dem Bildschirm gedruckten Zeile sollte auch teein das Protokoll geschrieben werden, wird aber aus irgendeinem Grund nicht in das Protokoll geschrieben.

Beispiel:

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

Können Sie den Grund dafür finden, dass es nicht ins Protokoll geschrieben wird?

Dank im Voraus,

Antwort1

Dies liegt daran, dass die echoAnweisungen zwar an gehen STDOUTund somit durch die Pipe an gesendet werden tee, die „Ausgabe“, die Sie vom wgetBefehl sehen, jedoch auf lautet STDERR, was nicht der Fall ist.

Dies geht standardmäßig nicht durch eine Pipe, sondern - wie Sie gesehen haben - ttystattdessen an. Wenn Sie senden möchtenbeide STDOUTund STDERRfür das einer Pipe STDINsollten Sie verwenden |&, zB

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

Das funktioniert in Bash und Tcsh, wenn ich mich recht erinnere. Für das Standard-SH ist es etwas mehr Arbeit, aber es ist trotzdem machbar (obwohl mir nicht spontan einfällt, wie).

Bearbeiten(von Anthony, dessen Kommentar folgt; Danke! – MadHatter):

Die Syntax für POSIX-kompatible Shells (sollte auch für funktionieren sh) wäre:

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

verwandte Informationen