Sous Linux, vous pouvez le faire avec :
stdin_is_dev_null(){ test "`stat -Lc %t:%T /dev/stdin`" = "`stat -Lc %t:%T /dev/null`"; }
Sur un Linux sans stat(1) (ex. la busybox sur votre routeur) :
stdin_is_dev_null(){ ls -Ll /proc/self/fd/0 | grep -q ' 1, *3 '; }
Sur *bsd :
stdin_is_dev_null(){ test "`stat -f %Z`" = "`stat -Lf %Z /dev/null`"; }
Sur des systèmes comme *bsd et solaris, /dev/stdin
, /dev/fd/0
et /proc/PID/fd/0
ne sont pas des liens symboliques "magiques" comme sur linux, mais des périphériques de caractères qui basculeront vers le vrai fichier lorsqu'il sera ouvert . Un stat(2) sur leur chemin renverra quelque chose de différent d'un fstat(2) sur le descripteur de fichier ouvert.
Cela signifie que l'exemple Linux ne fonctionnera pas là-bas, même avec les coreutils GNU installés. Si les versions de GNU stat(1) sont assez récentes, vous pouvez utiliser le -
argument pour le laisser faire un fstat(2) sur le descripteur de fichier 0, tout comme le stat(1) de *bsd :
stdin_is_dev_null(){ test "`stat -Lc %t:%T -`" = "`stat -Lc %t:%T /dev/null`"; }
Il est également très facile de faire la vérification de manière portable dans n'importe quel langage qui offre une interface avec fstat(2), par ex. en perl
:
stdin_is_dev_null(){ perl -e 'exit((stat STDIN)[6]!=(stat "/dev/null")[6])'; }
Sous Linux, pour déterminer si l'entrée standard est redirigée depuis /dev/null
, vous pouvez vérifier si /proc/self/fd/0
a le même périphérique et inode que /dev/null
:
if [ /proc/self/fd/0 -ef /dev/null ]; then echo yes; else echo no; fi
Vous pouvez utiliser /dev/stdin
au lieu de /proc/self/fd/0
.
Si vous souhaitez vérifier si l'entrée standard est redirigée depuis le périphérique nul, vous devez comparer les numéros de périphérique majeur et mineur, par exemple en utilisant stat
(voir aussi la réponse de mosvy):
if [ "$(stat -Lc %t:%T /dev/stdin)" = "$(stat -Lc %t:%T /dev/null)" ]; then echo yes; else echo no; fi
ou, si vous ne vous souciez pas du fait que cela soit spécifique à Linux,
if [ "$(stat -Lc %t:%T /dev/stdin)" = "1:3" ]; then echo yes; else echo no; fi
De manière portable, pour vérifier que stdin est le null
appareil (ouvert au /dev/null
ou non (comme une copie de /dev/null
)), avec zsh
(dont stat
builtin est antérieur à GNU et FreeBSD stat
au fait (mais pas IRIX))):
zmodload zsh/stat
if [ "$(stat +rdev -f 0)" = "$(stat +rdev /dev/null)" ]; then
echo stdin is open on the null device
fi
(notez qu'il ne dit pas si le descripteur de fichier était ouvert en mode lecture seule, écriture seule ou lecture+écriture).
Pour vérifier qu'il est ouvert sur le /dev/null
courant fichier spécifiquement (pas /some/chroot/dev/null
par exemple), sous Linux uniquement (où /dev/stdin
est implémenté comme un lien symbolique vers le fichier ouvert sur fd 0 au lieu d'un périphérique spécial qui, lorsqu'il est ouvert, agit comme un dup(0)
dans d'autres systèmes) :
if [ /dev/stdin -ef /dev/null ]; then
echo stdin is open on /dev/null
fi
Sur non-Linux, vous pouvez essayer :
if sh -c 'lsof -tad0 -p"$$" /dev/null' > /dev/null 2>&-; then
echo stdin is open on /dev/null
fi