Bash 파이프라인의 노드가 어떻게 입력 스트림을 볼 수 있지만 사용하지 않을 수 있나요?

Bash 파이프라인의 노드가 어떻게 입력 스트림을 볼 수 있지만 사용하지 않을 수 있나요?

Bash 파이프라인의 노드는 어떻게 입력 스트림을 사용하지 않고 보기만 할 수 있나요?

예를 들어, 아무것도 인쇄하지 않고 "인쇄"를 인쇄하도록 다음 스크립트를 어떻게 수정합니까? 특히 grep --quiet print보기만 하고 입력을 소비하지 않도록 수정하거나 교체하려면 어떻게 해야 합니까?

printf "%s\n" a b print c |
  if grep --quiet print
  then
    grep print | cat
  fi

산출:


원하는 출력:

print

peekgrep이상적으로는 유사 하지만 입력을 사용하지 않는 프로그램을 찾고 있습니다 . peek print입력에 "print"가 있으면 오류 코드 0이 반환되고, 그렇지 않으면 0이 아닌 오류 코드가 반환됩니다.

peek내 예에서 작동하는 방식은 다음과 같습니다 .

printf "%s\n" a b print c |
  if peek print
  then
    grep print | cat
  fi

산출:

print

단순히 결과를 필터링하는 대신 이렇게 하려는 이유는 grep print오류가 발생할 수 있는 빈 검색 결과를 처리하지 않기 위해서입니다.

답변1

제가 생각할 수 있는 간단한 방법 중 하나는 출력을 위해 임시 저장소를 사용하는 것입니다. 이는 아래와 같이 코드를 최소한으로 수정하여 수행할 수 있습니다.

atmp=$(mktemp "/tmp/XXXXXX")

printf "%s\n" a b print c | tee $atmp | 
  if grep --quiet print
  then
    grep print $atmp 
  fi  
rm $atmp #cleanup

이는 소규모 출력 배치에 적합할 수 있습니다.

답변2

@Tagwint와 유사한 또 다른 접근 방식답변결과를 쉘 변수에 저장 grep print한 다음 검색 결과가 있을 때만 해당 변수의 내용을 인쇄하는 것입니다.

printf "%s\n" a print b print c |
 if result=$(grep print)
 then
   echo "$result";
 fi

산출:

print
print

이는 검색 결과가 너무 크지 않을 때 허용됩니다.

답변3

fionread또한 다음을 사용하여 이 특정 예제의 문제를 해결했습니다.@모스비그의 구현답변도착하다파이프가 비어 있는지 확인하고 비어 있으면 데이터에 대해 명령을 실행하려면 어떻게 해야 합니까?.

printf "%s\n" a b print c | grep print | ./fionread echo found

산출:

found
printf "%s\n" a b c | grep print | ./fionread echo found

산출:


이는 FreeBSD 11.3에서 쉽게 컴파일됩니다 gcc.fionread.c

$ gcc -o fionread fionread.c
$ echo test | grep test | ./fionread echo found
found
$ echo | grep test | ./fionread echo found
$

답변4

표준 Unix 유틸리티나 Bash 스크립트는 아니지만 다음을 사용하여 이 특정 예제의 문제를 해결하기로 결정했습니다.ifne~에서더 많은 유틸리티:

printf "%s\n" a b print c | grep print | ifne echo found

산출:

found
printf "%s\n" a b c | grep print | ifne echo found

산출:


@닉워스lfne그의 글에서 언급된답변도착하다파이프가 비어 있는지 확인하고 비어 있으면 데이터에 대해 명령을 실행하려면 어떻게 해야 합니까?.

감사합니다@모스비~을 위한인용하다이 기존 질문에 대답하겠습니다.

관련 정보