GNU/Linux >> Tutoriels Linux >  >> Linux

Comment vérifier si stdin est /dev/null depuis le shell ?

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

Linux
  1. Comment Linux gère-t-il plusieurs séparateurs de chemins consécutifs (/home////nom d'utilisateur///fichier) ?

  2. Comment désactiver complètement un Cronjob vers /dev/null/?

  3. Linux – Comment créer /dev/null ?

  4. Comment encoder en base64 /dev/random ou /dev/urandom ?

  5. Comment rediriger la sortie d'une application en arrière-plan vers /dev/null

Comment rediriger la sortie vers /dev/null sous Linux

Comment détecter si le shell est contrôlé depuis Ssh ?

Comment mapper les périphériques /dev/sdX et /dev/mapper/mpathY à partir du périphérique /dev/dm-Z

Comment exécuter le fichier sh à partir d'un autre fichier sh

Comment vérifier si une commande shell existe depuis PHP

Linux :Différence entre /dev/console , /dev/tty et /dev/tty0