파이프라인에서 "ifne" 사용 - 여러 명령 실행

파이프라인에서 "ifne" 사용 - 여러 명령 실행

내 스크립트에서 나는 ifne사용 하고 있습니다moreutils팩. 이 줄은 다음과 같이 단순화될 수 있습니다.

printf "asdf\n" | ifne cat - && echo "stream not empty"

ifne스트림이 비어 있지 않은 경우에만 실행됩니다. 그런데 echo "stream not empty"스트림이 비어 있지 않은 경우에만 두 번째 명령( )이 실행되도록 하려면 어떻게 해야 합니까 ? 예를 들어, "스트림이 비어 있지 않습니다"라고 인쇄되지 않도록 다음 명령을 어떻게 변경합니까?

printf "" | ifne cat - && echo "stream not empty"

cat괄호 로 묶으면 echo구문 오류가 발생합니다.

printf "" | ifne (cat - && echo "stream not empty")

스트림이 비어 있지 않은 경우에만 마지막 명령을 어떻게 실행할 수 있습니까?

답변1

다음 형식을 사용하세요.

printf ""     | ifne sh -c  "cat - ; echo 'stream not empty' "

출력은 없음이며 다음과 같습니다.

printf "bb\n" | ifne sh -c  "cat - ; echo 'stream not empty' "

출력은 다음과 같습니다

bb
stream not empty

답변2

ifne종료 코드는 입력이 비어 있는지 여부에 따라 설정되지 않으므로 및가 &&예상 ||대로 작동하지 않습니다. Babyy의 답변에 대한 대안은 pee동일한 패키지를 사용하는 것입니다.

printf "asdf\n" | pee 'ifne cat -' 'ifne echo "stream not empty"'

유사하게 작동 tee하지만 입력 스트림을 여러 파이프에 복사하여 각 인수를 실행할 명령으로 처리합니다. ( tpipe유사한 명령이지만 약간 다르게 동작합니다.)

그러나 가능한 문제는 각 명령이 stdout에 병렬로 쓸 수 있고 입력/출력의 버퍼링 및 길이에 따라 출력이 인터리브되거나 각 실행마다 다를 수 있다는 것입니다(사실상 race ). sponge대신에 (동일한 패키지)를 사용 cat하거나 제거하는 것이 가능할 수 있습니다.기타 버퍼링/비버퍼링 솔루션. 제공한 예에는 영향을 주지만 실제 사용 사례에는 영향을 미치지 않을 수 있습니다.

관련 정보