내 스크립트에서 나는 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
하거나 제거하는 것이 가능할 수 있습니다.기타 버퍼링/비버퍼링 솔루션. 제공한 예에는 영향을 주지만 실제 사용 사례에는 영향을 미치지 않을 수 있습니다.