GNU/Linux >> Linux の 問題 >  >> Linux

stdin がシェルから /dev/null かどうかを確認する方法は?

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

Linux
  1. Linux:/ dev / console、/ dev / tty、/ dev / tty0の違いは?

  2. シェルがSshから制御されているかどうかを検出する方法は?

  3. PHPからシェルコマンドが存在するかどうかを確認する方法

  1. シェルから Vim コマンドを実行するには?

  2. /dev/zero から /dev/null への DD ...実際に何が起こるか

  3. Linux:/dev/console 、 /dev/tty 、 /dev/tty0 の違い

  1. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  2. Linux が /dev/tty と /dev/tty0 を使用する方法

  3. echo または print /dev/stdin /dev/stdout /dev/stderr