シェルでstdinが/dev/nullであるかどうかを確認するには?

シェルでstdinが/dev/nullであるかどうかを確認するには?

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/0Linuxのような「魔法の」シンボリックリンクではなく、実際のファイルに変換される文字デバイスです。開いたとき。そのパスの 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])'; }

おすすめ記事