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команды, находится в STDERR, что не так.

По умолчанию это не проходит через канал, а идет - как вы видели - в tty. Если вы хотите отправитьоба STDOUTи STDERRдля трубы STDIN, вы должны использовать |&, например

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

Это работает в bash и tcsh, если мне не изменяет память. Для стандартного sh это немного сложнее, но все равно можно сделать (хотя я не могу вспомнить, как).

Редактировать(от Энтони, чей комментарий следует; спасибо! - MadHatter):

Синтаксис для оболочек, совместимых с POSIX (также должен работать для sh), будет следующим:

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

Связанный контент