stdout을 교체하지 않고 grep을 사용하여 stdout 검색

stdout을 교체하지 않고 grep을 사용하여 stdout 검색

현재 나는 이것을 래퍼 스크립트에 넣었습니다.

2>&1 ./update.sh | ts | tee -a ./update.log

update.sh에서:

if apt full-upgrade -y | grep linux-headers
then
    echo
    echo Need to Fix the Capture Driver!
fi

(드라이버를 자동으로 수정하는 추가 논리가 있지만 이해하신 것 같습니다.)

apt full-upgrade작동하지만 터미널이나 로그 파일에 전체 출력이 표시되지 않습니다 . 일치하는 콘텐츠 만 가져옵니다 grep.

before, then 및 before 임시 파일에 tee전체 출력을 수행할 수 있지만 apt full-upgrade전체 터미널과 로그를 얻고 논리를 보존하는 이보다 더 좋은 방법이 있습니까?ifgreprm

답변1

/dev/stdout파이프를 가리키기 때문에 여기서는 사용할 수 없습니다 . 한 가지 접근 방식은 스크립트의 원시 stdout 복사본을 가져와서 인쇄하는 것입니다 tee(테스트하지는 않았습니다).

exec 9>&1    # make fd 9 a copy of the current stdout
apt full-upgrade -y | tee /dev/fd/9 | grep linux-headers
exec 9>&-    # close fd 9

전체 출력을 항상 터미널로 전송하려면 다음을 사용할 수 있습니다 /dev/tty.

apt full-upgrade -y | tee /dev/tty | grep linux-headers

그러나 이렇게 하면 전체 스크립트에 어떤 리디렉션이 적용되더라도 출력이 터미널로 이동하게 됩니다.


어떤 경우에는 프로세스 대체를 사용하여 출력을 stdout 외에 명령으로 리디렉션할 수 있습니다.

apt full-upgrade -y | tee >(grep linux-headers)

그러나 종료 상태가 필요 grep하고 프로세스 교체로 인해 이를 쉽게 얻을 수 없기 때문에 여기서는 작동하지 않습니다.

관련 정보