ifne
- 표준 입력이 비어 있지 않으면 명령 실행
가능하다면 표준 입력도 비어 있으면 명령의 다른 부분을 실행하고 싶습니다 ifne
.
$ printf "hello" | ifne echo "world"
world
여기서는 표준 입력이 비어 있으면 다른 명령문으로 끝내고 싶습니다.
$ printf "" | ifne echo "world" || echo "else"
그러나 아무것도 인쇄되지 않습니다. 가능 else
합니까 ifne
?
답변1
( ifne -n sh -c 'exec >&3; echo else' | ifne echo world ) 3>&1
표준 입력이 비어 있지 않으면 ifne -n
실행되지 않으며 마치 입력이 두 번째 입력으로 전달되는 sh …
것처럼 동작합니다 . 두 번째가 실행됩니다 . 매우 간단합니다.cat
ifne
ifne
echo world
표준 입력이 비어 있으면 ifne -n
실행됩니다 sh …
. 그냥 사용할 수는 없습니다 ifne -n echo else | …
. 그러면 else
두 번째 항목에 도달 ifne
하고 그것도 얻을 수 있기 때문입니다 world
. 따라서 우리는 3>&1
이전에도 전체 조각의 표준 출력에 액세스할 수 있습니다 |
. 파일 설명자로 사용할 수 있습니다. 3. 데이터가 에서 ifne -n echo else >&3 | …
까지 있어야 하는 null이 아닌 입력의 경우를 중단합니다 . 우리가 원하는 것을 얻으려면 리디렉션이 필요 하지만 리디렉션 자체는 필요하지 않습니다.ifne -n
ifne
echo
ifne -n
echo else
다른 명령으로 대체 할 수 있습니다 . 다른 명령으로 대체할 수 있습니다( 두 개 이상의 명령이 필요한 경우 echo word
일 수 있음 ). sh -c …
내 요점은 이 답변이 대안에 의존하거나 else
인쇄 world
되지 않는다는 것입니다. 침묵할 수도 있고 그렇지 않을 수도 있습니다. 그것은 중요하지 않습니다.
답변2
매뉴얼 페이지에서:
-n 역방향 작업입니다. 표준 입력이 비어 있으면 명령이 실행됩니다. 표준 입력이 비어 있지 않으면 이 경우 ifne을 통해 전달됩니다.
$ printf "not-empty\n" | ifne printf "This will print\n"
This will print
$ printf "" | ifne printf "This will not print\n"
$ printf "not-empty\n" | ifne -n printf "This will not print\n"
not-empty
$ printf "" | ifne -n printf "This will print\n"
This will print
이를 통해 다음을 수행할 수 있습니다.
$ dosoemthing | ifne -n printf "There was no output"
if-then-else 유형의 솔루션을 찾고 있다면 stdout을 tee
can call의 두 인스턴스 로 파이프할 수 있습니다 ifne
.
$ printf "if\n" | tee >(ifne printf "then\n") | ifne -n printf "else\n"
if
then
$ printf "" | tee >(ifne printf "then\n") | ifne -n printf "else\n"
else
그러나 원시 표준 출력을 인쇄할 수도 있습니다. 그런 과정을 거치는 거죠 ifne -n
.
답변3
기존 답변에 추가로 ifne
표준 입력에서 읽기를 시도하여 작동하며 무언가가 오면 명령을 실행하고 파이프 루프를 통해 데이터를 그 안에 삽니다.
그러나 대부분의 입력 유형에서는 입력을 읽지 않고도 입력이 있는지 감지할 수 있으므로 가져오기 처리가 절약되고 파이프가 발생하지 않습니다.
예를 들어 다음을 정의할 수 있습니다.
input_available() {
perl -MIO::Poll -e '
$p = IO::Poll->new;
$p->mask(STDIN, POLLIN);
$p->poll or die "poll: $!\n";
exit(1) unless $p->events(STDIN) & POLLIN;
require "sys/ioctl.ph";
$n = pack("L", 0);
ioctl(STDIN, &FIONREAD, $n) or die"ioctl: $!\n";
$n = unpack("L", $n);
exit(1) unless $n > 0'
}
그런 다음 다음을 수행할 수 있습니다.
some-command |
if input_available; then
echo Input available:
cat
else
echo No input available
fi
poll()
Linux에서는 POLLIN
일부 데이터가 존재할 때만 파이프에 표시가 수행되지만 일부 시스템에서는 POLLIN으로 파일 끝을 표시하기 때문에 모든 시스템에 해당되는 것은 아닙니다. 따라서 FIONREAD ioctl은 실제로 데이터가 있는지 확인합니다. 이 ioctl은 모든 유형의 입력에서 작동하지 않습니다. 예를 들어 Linux에서는 작동하지 않는 것으로 나타났습니다 /dev/null
. 그러나 적어도 일반 파일, 파이프 및 tty 장치에서는 작동합니다.
답변4
관로
somecommand | ifne echo something
... 표준 출력에 기록되면 출력(문자열 something
)을 생성합니다.somecommand
파이프가 출력을 생성하지 않으면 somecommand
출력도 생성되지 않습니다. 이는 다음을 통해 캡처할 수 있습니다 ifne -n
.
somecommand | ifne echo something | ifne -n echo nothing
시험:
$ printf 'ok' | ifne echo something | ifne -n echo nothing
something
$ printf '' | ifne echo something | ifne -n echo nothing
nothing
이렇게 하면 파이프라인에서 가장 왼쪽 명령의 출력이 삭제됩니다. 이 문제는 다음과 같은 것을 사용하여 해결할 수 있습니다.
ifne sh -c 'cat;echo something'
...파이프라인의 두 번째 명령으로, cat
어떤 명령이든 왼쪽에서 출력을 받아야 합니다.
이는 또한 마지막 명령이 입력을 제공하지 않는 반면 첫 번째 명령은 출력을 생성하지 않는다는 사실에 의존합니다.