GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo comprobar si stdin es/dev/null desde el shell?

En Linux, puedes hacerlo con:

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

En un linux sin stat(1) (por ejemplo, el cuadro ocupado en su enrutador):

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

En *bsd:

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

En sistemas como *bsd y solaris, /dev/stdin , /dev/fd/0 y /proc/PID/fd/0 no son enlaces simbólicos "mágicos" como en Linux, sino dispositivos de caracteres que cambiarán al archivo real cuando se abra . Un stat(2) en su ruta devolverá algo diferente a un fstat(2) en el descriptor de archivo abierto.

Esto significa que el ejemplo de Linux no funcionará allí, incluso con GNU coreutils instalado. Si las versiones de GNU stat(1) son lo suficientemente recientes, puede usar el - argumento para permitirle hacer un fstat(2) en el descriptor de archivo 0, al igual que el stat(1) de *bsd:

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

También es muy fácil hacer la verificación portablemente en cualquier idioma que ofrezca una interfaz para fstat(2), p. en perl :

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

En Linux, para determinar si la entrada estándar se redirige desde /dev/null , puede verificar si /proc/self/fd/0 tiene el mismo dispositivo e inodo que /dev/null :

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

Puedes usar /dev/stdin en lugar de /proc/self/fd/0 .

Si desea verificar si la entrada estándar se redirige desde el dispositivo nulo, debe comparar los números de dispositivos principales y secundarios, por ejemplo, usando stat (ver también la respuesta de mosvy):

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

o, si no le importa que esto sea específico de Linux,

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

Portable, para comprobar que stdin es el null dispositivo (abrir en /dev/null o no (como una copia de /dev/null )), con zsh (cuyo stat incorporado es anterior a GNU y FreeBSD stat por cierto (aunque no de IRIX))):

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

(Tenga en cuenta que no dice si el descriptor de archivo estaba abierto en modo de solo lectura, solo escritura o lectura+escritura).

Para comprobar que está abierto en el /dev/null actual archivo específicamente (no /some/chroot/dev/null por ejemplo), solo en Linux (donde /dev/stdin se implementa como un enlace simbólico al archivo abierto en fd 0 en lugar de un dispositivo especial que, cuando se abre, actúa como un dup(0) en otros sistemas):

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

Si no utiliza Linux, puede probar:

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

Linux
  1. ¿Cómo maneja Linux múltiples separadores de rutas consecutivas (/home////username///file)?

  2. Linux:¿Diferencia entre /dev/console, /dev/tty y /dev/tty0?

  3. Cómo silenciar completamente un cronjob a /dev/null/?

  4. Cómo verificar si existe un comando de shell desde PHP

  5. ¿Cómo ejecutar el comando Vim desde el shell?

Cómo redirigir la salida a /dev/null en Linux

Cómo ejecutar un archivo sh desde otro archivo sh

pantalla No se puede abrir su terminal '/dev/pts/0' - verifique

¿Cómo crear/dev/null?

Linux:diferencia entre /dev/console, /dev/tty y /dev/tty0

hacer eco o imprimir /dev/stdin /dev/stdout /dev/stderr