
xargs --no-run-if-empty
나는 stdin이 비어 있는 경우에만 실행되도록 의 반대 작업을 수행하고 싶습니다 .
사용 예:
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