stdin이 비어 있으면 명령 실행

stdin이 비어 있으면 명령 실행

xargs --no-run-if-empty표준 입력이 비어 있을 때만 실행되도록 반대 작업을 수행하고 싶습니다 .

사용 예:

ip a | fgrep "inet " | grep -ve " tun" -e " lo"
# pipe it into something and echo localhost if empty

답변1

이 경우 grep아무것도 발견되지 않으면(출력 없음) 오류 코드가 반환됩니다. 따라서 표준 출력을 볼 필요가 없습니다. 대신 오류 코드를 볼 수 있습니다. ||이 작업이 완료되고 이전 명령이 실패한 경우에만 다음 명령이 실행됩니다.

ip a | fgrep "inet " | grep -ve " tun" -e " lo" || echo localhost

답변2

이 패키지는 도구를 moreutils제공합니다 ifne. 일반적으로 ifne표준 입력이 다음과 같은 경우에만 주어진 명령을 실행합니다.아니요비어 있는. 그러나 그것은역동작모델:

-n

역방향 작동. 표준 입력이 비어 있으면 명령이 실행됩니다.

ifne표준 입력이 비어 있지 않으면 이 경우 전달됩니다.

다음과 같이 사용하세요:

ip a | fgrep "inet " | grep -ve " tun" -e " lo" | ifne -n echo "localhost"

이것이 다른 답변과 다른 점입니다.

  • 이 솔루션은 명령의 종료 상태에 의존하지 않습니다.
  • ifne스트림이 비어 있지 않으면 스트림이 소비되지 않습니다(이것이 원하는 것인지 확실하지 않습니다).

텍스트 대안은 입니다 awk '{print} END {if (NR==0) print "localhost"}'. 텍스트가 아닌 데이터(POSIX 용어: NUL 문자, {LINE_MAX}개 이상, 불완전한 행)의 경우 awk원하는 방식으로 작동하지 않을 수 있습니다.

답변3

이런 간단한 조건을 시도해 보셨나요?

[[ -z $(ip a | fgrep "inet " | grep -ve " tun" -e " lo") ]] && echo localhost

관련 정보