Su Linux, puoi farlo con:
stdin_is_dev_null(){ test "`stat -Lc %t:%T /dev/stdin`" = "`stat -Lc %t:%T /dev/null`"; }
Su un Linux senza stat(1) (es. busybox sul tuo router):
stdin_is_dev_null(){ ls -Ll /proc/self/fd/0 | grep -q ' 1, *3 '; }
Su *bsd:
stdin_is_dev_null(){ test "`stat -f %Z`" = "`stat -Lf %Z /dev/null`"; }
Su sistemi come *bsd e solaris, /dev/stdin
, /dev/fd/0
e /proc/PID/fd/0
non sono collegamenti simbolici "magici" come su Linux, ma dispositivi a caratteri che passeranno al file reale quando vengono aperti . Uno stat(2) sul loro percorso restituirà qualcosa di diverso da un fstat(2) sul descrittore di file aperto.
Ciò significa che l'esempio di Linux non funzionerà lì, anche con GNU coreutils installato. Se la versione di GNU stat(1) è abbastanza recente, puoi usare -
argomento per fargli fare un fstat(2) sul descrittore di file 0, proprio come stat(1) da *bsd:
stdin_is_dev_null(){ test "`stat -Lc %t:%T -`" = "`stat -Lc %t:%T /dev/null`"; }
È anche molto semplice eseguire il controllo in modo portatile in qualsiasi linguaggio che offra un'interfaccia a fstat(2), ad es. in perl
:
stdin_is_dev_null(){ perl -e 'exit((stat STDIN)[6]!=(stat "/dev/null")[6])'; }
Su Linux, per determinare se l'input standard viene reindirizzato da /dev/null
, puoi controllare se /proc/self/fd/0
ha lo stesso dispositivo e inode di /dev/null
:
if [ /proc/self/fd/0 -ef /dev/null ]; then echo yes; else echo no; fi
Puoi usare /dev/stdin
invece di /proc/self/fd/0
.
Se vuoi verificare se l'input standard viene reindirizzato dal dispositivo nullo, devi confrontare i numeri del dispositivo principale e secondario, ad esempio utilizzando stat
(vedi anche la risposta di mosvy):
if [ "$(stat -Lc %t:%T /dev/stdin)" = "$(stat -Lc %t:%T /dev/null)" ]; then echo yes; else echo no; fi
oppure, se non ti interessa che sia specifico per Linux,
if [ "$(stat -Lc %t:%T /dev/stdin)" = "1:3" ]; then echo yes; else echo no; fi
Portably, per verificare che stdin sia null
dispositivo (aperto su /dev/null
o meno (come una copia di /dev/null
)), con zsh
(il cui stat
builtin precede sia GNU che FreeBSD stat
a proposito (non IRIX' però))):
zmodload zsh/stat
if [ "$(stat +rdev -f 0)" = "$(stat +rdev /dev/null)" ]; then
echo stdin is open on the null device
fi
(nota che non dice se il descrittore di file era aperto in modalità sola lettura, sola scrittura o lettura+scrittura).
Per verificare che sia aperto sull'attuale /dev/null
file specifico (non /some/chroot/dev/null
per esempio), solo su Linux (dove /dev/stdin
è implementato come collegamento simbolico al file aperto su fd 0 invece di un dispositivo speciale che quando aperto si comporta come un dup(0)
in altri sistemi):
if [ /dev/stdin -ef /dev/null ]; then
echo stdin is open on /dev/null
fi
Su non Linux, puoi provare:
if sh -c 'lsof -tad0 -p"$$" /dev/null' > /dev/null 2>&-; then
echo stdin is open on /dev/null
fi