이것은 쉘 스크립트의 내 명령입니다. 모든 출력을 표준 로그 파일로 리디렉션하고 싶습니다. 디렉터리나 하위 디렉터리가 있는 *.txt 파일을 찾을 수 없는 경우 std 출력 화면에 o/p를 기록한다는 점을 제외하면 훌륭한 작업을 수행합니다. 이를 억제하고 로그 파일로 보내려면 어떻게 해야 합니까?
TOTALFILES=`ls $SOURCEDIR/$SOURCESUBDIR/*.txt| wc -l` >> $WORKDIR/$LOGFNAME
답변1
그것확실히"표준 출력에 o/p 쓰기". stderr
그리고 파일에 표준 출력도 쓰지 않습니다 . 명령 대체를 사용하면 stdout을 변수에 쓰라고 지시하는 것입니다 TOTALFILES
.
출력을 변수와 파일 모두로 이동하려면 다음을 사용해야 합니다 tee
.
totalfiles=$(ls "${sourcedir}/${sourcesubdir}/"*.txt | wc -l | tee "${workdir}/${logfname}")
그러나 이는 stderr을 로그 파일로 보내지 않으며 다음을 수행할 수 있습니다.
totalfiles=$(ls "${sourcedir}/${sourcesubdir}/"*.txt 2>"${workdir}/${logfname}" | wc -l | tee "${workdir}/${logfname}")
stdin은 fd0
stdout은 fd1
stderr은 fd2
표준 출력 리디렉션:
foo > /path/file
이는 다음과 같습니다.
foo 1> /path/file
표준 오류 리디렉션:
foo 2> /path/file
둘 다 리디렉션하려면 다음을 수행하세요.
foo > /path/file 2>&1
리디렉션 순서가 중요합니다.
읽다: 3.6 리디렉션
&>
Bash를 사용하면 다음 명령을 사용하여 이 시간을 단축할 수도 있습니다 .
foo &> /path/file
(변수 이름을 대문자로 사용하지 말아야 하며 대신 모든 변수를 인용하고 $( ... )
백틱을 사용해야 합니다.