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