나는 다음의 솔루션을 사용하고 있습니다.명령이 빈 문자열을 출력하는지 테스트. 이러한 해결 방법 외에도 명령 출력을 인쇄하고 싶습니다(비어 있지 않은 경우).
명령의 출력이 비어 있지 않은 경우 명령을 한 번만 호출하여 명령의 출력을 인쇄할 수 있는지 알고 싶습니다.
에서 동일한 명령을 다시 호출하여 이 작업을 수행할 수 있지만 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
).