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