
Bash 파이프라인의 노드는 어떻게 입력 스트림을 사용하지 않고 보기만 할 수 있나요?
예를 들어, 아무것도 인쇄하지 않고 "인쇄"를 인쇄하도록 다음 스크립트를 어떻게 수정합니까? 특히 grep --quiet print
보기만 하고 입력을 소비하지 않도록 수정하거나 교체하려면 어떻게 해야 합니까?
printf "%s\n" a b print c |
if grep --quiet print
then
grep print | cat
fi
산출:
원하는 출력:
print
peek
grep
이상적으로는 유사 하지만 입력을 사용하지 않는 프로그램을 찾고 있습니다 . 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
그의 글에서 언급된답변도착하다파이프가 비어 있는지 확인하고 비어 있으면 데이터에 대해 명령을 실행하려면 어떻게 해야 합니까?.