Linux에서는 이상적으로 아무것도 읽지 않고 표준 입력이 빈 장치 (1, 3) * 에서 리디렉션되고 있는지 쉘 스크립트에서 확인하는 방법이 있습니까?
예상되는 동작은 다음과 같습니다.
./checkstdinnull
-> no
./checkstdinnull < /dev/null
-> yes
echo -n | ./checkstdinnull
-> no
EDIT
mknod secretunknownname c 1 3
exec 6<secretunknownname
rm secretunknownname
./checkstdinnull <&6
-> yes
나는 "단지" 입력의 최대/최소 수를 읽어야 한다고 생각합니다.장비. 하지만 쉘에서 이 작업을 수행하는 방법을 찾을 수 없습니다.
* 반드시 꼭 필요한 것은 아니지만
/dev/null
,어느수동으로 생성해도 장치가 비어 있습니다 mknod
.
답변1
Linux에서는 다음과 같이 할 수 있습니다.
stdin_is_dev_null(){ test "`stat -Lc %t:%T /dev/stdin`" = "`stat -Lc %t:%T /dev/null`"; }
stat(1)이 없는 Linux(예: 라우터의 busybox):
stdin_is_dev_null(){ ls -Ll /proc/self/fd/0 | grep -q ' 1, *3 '; }
*bsd에서:
stdin_is_dev_null(){ test "`stat -f %Z`" = "`stat -Lf %Z /dev/null`"; }
*bsd 및 Solaris와 같은 시스템에서 , /dev/stdin
및 /dev/fd/0
는 /proc/PID/fd/0
Linux와 같은 "마법의" 심볼릭 링크가 아니라 실제 파일로 전환되는 문자 장치입니다.열 때. 해당 경로의 stat(2)는 열린 파일 설명자에서 fstat(2)와 다른 것을 반환합니다.
이는 GNU coreutils가 설치되어 있어도 Linux 예제가 작동하지 않음을 의미합니다. GNU stat(1)이 충분히 새롭다면 -
*bsd의 stat(1)처럼 인수를 사용하여 파일 설명자 0에서 fstat(2)를 수행하도록 할 수 있습니다.
stdin_is_dev_null(){ test "`stat -Lc %t:%T -`" = "`stat -Lc %t:%T /dev/null`"; }
확인도 간편하다가지고 다닐 수 있는예를 들어, fstat(2) 인터페이스를 제공하는 모든 언어. 존재하다 perl
:
stdin_is_dev_null(){ perl -e 'exit((stat STDIN)[6]!=(stat "/dev/null")[6])'; }
답변2
Linux에서는 표준 입력이 에서 리디렉션되는지 확인하려면 다음 과 동일한 장치 및 inode가 있는지 /dev/null
확인하면 됩니다 ./proc/self/fd/0
/dev/null
if [ /proc/self/fd/0 -ef /dev/null ]; then echo yes; else echo no; fi
/dev/stdin
대신 사용할 수 있습니다 /proc/self/fd/0
.
표준 입력이 널 장치에서 리디렉션되는지 확인하려면 메이저 장치 번호와 마이너 장치 번호를 비교해야 합니다 stat
.Mosvi의 답변):
if [ "$(stat -Lc %t:%T /dev/stdin)" = "$(stat -Lc %t:%T /dev/null)" ]; then echo yes; else echo no; fi
아니면 이 존재에 관심이 없다면리눅스 전용,
if [ "$(stat -Lc %t:%T /dev/stdin)" = "1:3" ]; then echo yes; else echo no; fi
답변3
null
이식 가능하게, stdin이 장치 의 복사본 인지 (open /dev/null
인지 아닌지 /dev/null
) 확인하려면 다음을 사용하십시오 zsh
(덧붙여서 stat
내장된 기능은 GNU 및 FreeBSD보다 우선합니다 stat
(IRIX는 아님)).
zmodload zsh/stat
if [ "$(stat +rdev -f 0)" = "$(stat +rdev /dev/null)" ]; then
echo stdin is open on the null device
fi
(파일 설명자가 읽기 전용, 쓰기 전용 또는 읽기+쓰기 모드로 열리는지는 알려주지 않습니다.)
/dev/null
현재 파일(예: 아님)에서 열려 있는지 확인하려면 /some/chroot/dev/null
Linux에서만( /dev/stdin
다른 시스템에서 열 때 특수 장치가 아니라 fd 0 에서 열린 파일에 대한 심볼릭 링크로 구현됨 dup(0)
) 다음을 수행하십시오.
if [ /dev/stdin -ef /dev/null ]; then
echo stdin is open on /dev/null
fi
Linux가 아닌 경우 다음을 시도해 볼 수 있습니다.
if sh -c 'lsof -tad0 -p"$$" /dev/null' > /dev/null 2>&-; then
echo stdin is open on /dev/null
fi