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