명령 출력에 "rerun"(그런 다음 다시 실행)이 포함되어 있는지 확인하고 싶지만 전체 출력도 표시하고 싶습니다. 다음 중 하나를 사용할 수 있다는 것을 알고 있습니다.
command | tee >(grep rerun)
command | grep rerun
첫 번째는 예상대로 전체 출력을 인쇄하지만 항상 0을 반환하기 때문에 조건으로 사용할 수 없습니다. 두 번째는 rerun이 포함된 행만 인쇄하지만 일치하는 항목이 없으면 1을 반환합니다.
내 사용 예:
while pdflatex paper.tex | grep -E "rerun LaTeX|run Biber"; do
biber paper
done
여기에 제공된 답변grep은 항상 0을 반환하므로 도움이 되지 않습니다.
답변1
그냥 사용
command | tee outfile | grep rerun
또는
while pdflatex paper.tex | tee outfile | grep -E "rerun LaTeX|run Biber"; do
grep 명령의 상태를 확인하고 나중에 "output" 파일을 볼 수 있습니다.
답변2
파일을 보고 해당 파일을 grep할 수 있습니다. 그런 다음 종료 코드를 grep할 수 있습니다(0은 일치를 의미함).
RERUN=1
while [[ $RERUN == 1 ]] ; do
biber paper
! pdflatex paper.tex | tee output.txt && grep -E -q "rerun LaTeX|run Biber" output.txt
RERUN=$?
done
4행에서는 !
grep이 일치 항목을 찾으면 0을 반환하고 일치 항목이 없으면 1을 반환하기 때문에 grep 프로세스의 종료 코드를 반대로 바꿉니다.grep 매뉴얼 페이지:
종료 상태
Normally the exit status is 0 if a line is selected, 1 if no lines were selected, and 2 if an error occurred. However, if the -q or --quiet or --silent is used and a line is selected, the exit status is 0 even if an error occurred.
5행에서는 마지막 종료 코드( $?
)를 루프 조건에 사용되는 RERUN 변수에 넣습니다.
또한 -q
stdout에 쓰지 않도록 grep에 옵션을 추가했습니다.
답변3
stdout
즉각적인 표시를 고집하는 경우 grep
프로세스 대체의 출력을 파일로 리디렉션하여 출력에서 중복 행을 방지해야 하므로 다음을 수행해야 합니다 command | tee >(grep rerun >/tmp/my.log)
.
[[ -s /tmp/my.log ]]
파일이 생성되면 이를 재실행 조건으로 사용하기 만 하면 됩니다 .