GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara memeriksa apakah stdin /dev/null dari shell?

Di linux, Anda dapat melakukannya dengan:

stdin_is_dev_null(){ test "`stat -Lc %t:%T /dev/stdin`" = "`stat -Lc %t:%T /dev/null`"; }

Di linux tanpa stat(1) (mis. busybox di router Anda):

stdin_is_dev_null(){ ls -Ll /proc/self/fd/0 | grep -q ' 1,  *3 '; }

Pada *bsd:

stdin_is_dev_null(){ test "`stat -f %Z`" = "`stat -Lf %Z /dev/null`"; }

Pada sistem seperti *bsd dan solaris, /dev/stdin , /dev/fd/0 dan /proc/PID/fd/0 bukan symlink "ajaib" seperti di linux, tetapi perangkat karakter yang akan beralih ke file asli ketika dibuka . Stat(2) di jalurnya akan mengembalikan sesuatu yang berbeda dari fstat(2) pada deskriptor file yang dibuka.

Ini berarti bahwa contoh linux tidak akan berfungsi di sana, bahkan dengan GNU coreutils terpasang. Jika versi GNU stat(1) cukup baru, Anda dapat menggunakan - argumen untuk membiarkannya melakukan fstat(2) pada deskriptor file 0, seperti stat(1) dari *bsd:

stdin_is_dev_null(){ test "`stat -Lc %t:%T -`" = "`stat -Lc %t:%T /dev/null`"; }

Juga sangat mudah untuk melakukan pemeriksaan secara portabel dalam bahasa apa pun yang menawarkan antarmuka ke fstat(2), mis. di perl :

stdin_is_dev_null(){ perl -e 'exit((stat STDIN)[6]!=(stat "/dev/null")[6])'; }

Di Linux, untuk menentukan apakah input standar dialihkan dari /dev/null , Anda dapat memeriksa apakah /proc/self/fd/0 memiliki perangkat dan inode yang sama dengan /dev/null :

if [ /proc/self/fd/0 -ef /dev/null ]; then echo yes; else echo no; fi

Anda dapat menggunakan /dev/stdin bukannya /proc/self/fd/0 .

Jika Anda ingin memeriksa apakah input standar dialihkan dari perangkat null, Anda perlu membandingkan nomor perangkat mayor dan minor, misalnya menggunakan stat (lihat juga jawaban mosvy):

if [ "$(stat -Lc %t:%T /dev/stdin)" = "$(stat -Lc %t:%T /dev/null)" ]; then echo yes; else echo no; fi

atau, jika Anda tidak peduli ini khusus untuk Linux,

if [ "$(stat -Lc %t:%T /dev/stdin)" = "1:3" ]; then echo yes; else echo no; fi

Mudah-mudahan, untuk memeriksa bahwa stdin adalah null perangkat (buka di /dev/null atau tidak (seperti salinan /dev/null )), dengan zsh (yang stat builtin mendahului GNU dan FreeBSD stat ngomong-ngomong (bukan IRIX'))):

zmodload zsh/stat
if [ "$(stat +rdev -f 0)" = "$(stat +rdev /dev/null)" ]; then
  echo stdin is open on the null device
fi

(perhatikan bahwa tidak disebutkan apakah deskriptor file dibuka dalam mode baca-saja, tulis-saja, atau baca+tulis).

Untuk memeriksa apakah itu terbuka pada /dev/null saat ini file khusus (bukan /some/chroot/dev/null misalnya), hanya di Linux (di mana /dev/stdin diimplementasikan sebagai symlink ke file yang dibuka di fd 0 alih-alih perangkat khusus yang ketika dibuka berfungsi seperti dup(0) di sistem lain):

if [ /dev/stdin -ef /dev/null ]; then
  echo stdin is open on /dev/null
fi

Di non-Linux, Anda dapat mencoba:

if sh -c 'lsof -tad0 -p"$$" /dev/null' > /dev/null 2>&-; then
  echo stdin is open on /dev/null
fi

Linux
  1. Linux:Perbedaan Antara /dev/console , /dev/tty Dan /dev/tty0?

  2. Bagaimana Mendeteksi Jika Shell Dikendalikan Dari Ssh?

  3. Bagaimana Membungkam Sepenuhnya Cronjob Ke /dev/null/?

  1. Bagaimana cara menyandikan base64 /dev/random atau /dev/urandom?

  2. Cara menjalankan file sh dari file sh lain

  3. Cara memeriksa apakah ada perintah shell dari PHP

  1. Bagaimana cara menjalankan perintah Vim dari shell?

  2. Bagaimana cara membuat /dev/null?

  3. Linux:Perbedaan antara /dev/console , /dev/tty dan /dev/tty0