캡처하지 않고 명령 출력이 비어 있으면 1을 반환합니다.

캡처하지 않고 명령 출력이 비어 있으면 1을 반환합니다.

여러 파이프로 끝나는 쉘 스크립트가 있고 grep ... | while read ...| sort | uniq출력이 비어 있으면 1을 반환하고 싶지만 입력이 비어 있어도 uniq는 항상 0을 반환합니다.

지금까지 제가 찾은 최고의 솔루션은 빈 패턴으로 grep을 추가하는 것입니다 ... uniq | grep ''. 이는 완벽하게 작동하지만 해킹처럼 느껴집니다.

그래서 내 질문은: 이 작업을 수행하는 더 나은/표준적인 방법이 있습니까?

몇 가지 제한사항:

  • 나중에 다시 인쇄해야 하기 때문에 출력을 변수에 캡처하고 싶지 않습니다. a=$(... | uniq); printf '%s\n' "$a"; [ -n "$a" ]이것도 옳지 않다고 생각됩니다.
  • 또한 가능하다면 표준 도구(더 이상 유틸리티 없음)와 휴대용 도구를 선호합니다.

감사해요!

답변1

솔직히 | grep ''괜찮다고 생각해요. 파이프라인에 이미 많은 프로그램이 있으므로 다른 프로그램을 개발해도 문제가 되지 않습니다. 그리고 여러분은 그것이 무엇 grep인지 이미 알고 있으므로 이를 수행하기 위해 "스마트한" 쉘 조각을 작성할 필요가 없습니다.

의견에서는 | grep .이것이 또 다른 가능성일 수도 있다고 언급했습니다. grep .빈 줄은 일치하지 grep ''않고 일치하게 되므로 원하는 내용에 따라 선택하세요.

그러나 이러한 사용은 grep일반 독자에게는 즉시 명확하지 않을 수 있으므로 어쨌든 해당 목적에 대한 메모를 추가할 수 있습니다.

답변2

나는 이것이 일을 해야 한다고 생각합니다:

[ -n "$(command | tee /dev/tty)" ]

teecommand출력을 stdout( 명령으로 평가 test)과 터미널( )로 보내 /dev/tty므로 출력을 변수에 캡처하지 않고도 볼 수 있습니다.

이것은 POSIX 호환 솔루션 AFAIK입니다.

관련 정보