Bash: tee를 사용하는 동안 명령 출력은 화면에만 기록되고 다른 파일에는 기록되지 않습니다. 이유가 무엇일까요?

Bash: tee를 사용하는 동안 명령 출력은 화면에만 기록되고 다른 파일에는 기록되지 않습니다. 이유가 무엇일까요?

일부 FTP 연결 오류를 해결하기 위해 원격 FRP 서버에 무한히 연결하고 거기에서 하나의 파일을 가져오는 bash 스크립트를 작성하라는 지시를 받았습니다.

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에서 보고 있는 "출력"은 wgeton STDERR이기 때문입니다.

이것은 기본적으로 파이프를 통과하지 않고, 보시다시피 대신 파이프로 이동합니다 tty. 보내고 싶다면둘 다 STDOUTSTDERR파이프에는 을 STDIN사용해야 합니다 |&. 예를 들어

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

메모리가 제공된다면 bash와 tcsh에서 작동합니다. 늪지 표준 sh의 경우 작업이 조금 더 필요하지만 여전히 수행할 수 있습니다(비록 어떻게 하는지 기억이 나지 않지만).

편집하다(Anthony의 의견은 다음과 같습니다. 감사합니다! - MadHatter):

POSIX 호환 쉘( 에서도 작동함 sh)의 구문은 다음과 같습니다.

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

관련 정보