Linux では、次のコマンドで実行できます:
stdin_is_dev_null(){ test "`stat -Lc %t:%T /dev/stdin`" = "`stat -Lc %t:%T /dev/null`"; }
stat(1) のない Linux の場合 (例:ルーターのビジーボックス):
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])'; }
Linux で、標準入力が /dev/null
からリダイレクトされているかどうかを判別するには 、 /proc/self/fd/0
かどうかを確認できます /dev/null
と同じデバイスと inode を持つ :
if [ /proc/self/fd/0 -ef /dev/null ]; then echo yes; else echo no; fi
/dev/stdin
を使用できます /proc/self/fd/0
の代わりに .
標準入力が null デバイスからリダイレクトされているかどうかを確認したい場合は、たとえば stat
を使用して、メジャー デバイス番号とマイナー デバイス番号を比較する必要があります。 (mosvy の回答も参照してください):
if [ "$(stat -Lc %t:%T /dev/stdin)" = "$(stat -Lc %t:%T /dev/null)" ]; then echo yes; else echo no; fi
または、これが Linux 固有であることを気にしない場合は、
if [ "$(stat -Lc %t:%T /dev/stdin)" = "1:3" ]; then echo yes; else echo no; fi
ポータブルに、stdin が null
であることを確認するには デバイス (/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
の場合) 開いたときに dup(0)
のように動作する特別なデバイスではなく、fd 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