명령의 출력이 빈 문자열인지 테스트하고 그렇지 않으면 결과를 인쇄합니다.

명령의 출력이 빈 문자열인지 테스트하고 그렇지 않으면 결과를 인쇄합니다.

나는 다음의 솔루션을 사용하고 있습니다.명령이 빈 문자열을 출력하는지 테스트. 이러한 해결 방법 외에도 명령 출력을 인쇄하고 싶습니다(비어 있지 않은 경우).

명령의 출력이 비어 있지 않은 경우 명령을 한 번만 호출하여 명령의 출력을 인쇄할 수 있는지 알고 싶습니다.

에서 동일한 명령을 다시 호출하여 이 작업을 수행할 수 있지만 if condition이제 결과가 이미 있으므로 두 번째 호출에서 CPU 사용량이 추가로 소모될 수 있습니다.


가능한 방법은 동일한 명령이 두 번 호출되는 것입니다.

if [[ $(ls -A) ]]; then
    ls -A
else
    echo "no files found"
fi

output=$(git diff --ignore-blank-lines --color-words HEAD | tr -d ' \n\r\t ' | wc -c)
if [ "$output" -gt 0 ]; then
    git diff --ignore-blank-lines --color-words HEAD 
else
    echo "diff is empty"
fi

답변1

노트:이 질문은 원래 태그되었습니다., 그러나 OP는 사용된 쉘이 이라고 명시했습니다 zsh. 이로 인해 답변이 다소 유효하지 않게 됩니다.

명령의 출력을 변수에 저장하고 변수가 비어 있는지 테스트할 수 있습니다.

output="$(your_command)"

if [[ -n $output ]]
then
    printf -- "%s\n" "$output"
else
    printf -- "No output\n"
fi

이 테스트는 비어 있지 않은 문자열인지 -n확인합니다 . $output그렇다면 $output무엇이 인쇄됩니까? 그렇지 않으면 출력이 생성되지 않았다는 메시지가 인쇄됩니다.알아채다주변 따옴표 "$output"가 필요합니다.

또한 참고하시기 바랍니다(@ilkkachu가 언급했듯이) 후행 줄 바꿈은 명령 대체를 통해 제거되므로 이에 관심이 있다면 다른 접근 방식을 취해야 합니다.

답변2

어떤 경우든 출력이 필요한 경우 파이프를 사용 tee하여 명령을 다시 실행하지 않고도 출력을 복사할 수 있습니다. 한 번은 표준 출력으로, 한 번은 빈 입력에서 작동하는 명령으로 사용합니다.

예를 들어:

ls | tee >([ $(wc -m) -gt 0 ] || echo No output)

이는 표준 출력만 처리하므로 오류 메시지 다음에 "출력 없음"이 나타날 수 있습니다. 터미널로의 전송 여부에 따라 명령의 출력이 변경되면 이에 맞게 명령도 조정해야 합니다(예를 들어 ls -C또는 컬러로 출력).

답변3

명령을 예로 들면 ls -A다음 작업이 수행됩니다.

if ls -A | grep ^; then
   : the output was already written
else
   : no output
fi

if ! ls -A | grep ^; then
   : handle the no-output condition
fi

이렇게 하면 후행 줄 바꿈이 출력에 보존됩니다.

이 글에 언급된 실제 사례에 대해논평(빈 출력으로 실행하지 마십시오 ) ("한 화면이면 종료") 옵션이 less있습니다 :-F

command ... | less -FXR

( X최신 버전은 생략할 수 있습니다 less).

관련 정보