En Linux, ¿hay alguna forma de que un script de shell compruebe si su entrada estándar se redirige desde el dispositivo nulo (1, 3) * , idealmente sin leer nada?
El comportamiento esperado sería:
./checkstdinnull
-> no
./checkstdinnull < /dev/null
-> yes
echo -n | ./checkstdinnull
-> no
EDIT
mknod secretunknownname c 1 3
exec 6<secretunknownname
rm secretunknownname
./checkstdinnull <&6
-> yes
Sospecho que "solo" necesito leer el número de may / min del dispositivo de entrada . Pero no puedo encontrar una manera de hacerlo desde el shell.
* No es necesario solo
/dev/null
, pero cualquier dispositivo nulo, incluso si se creó manualmente con mknod
.
/dev/null
, o simplemente que no es un tty?{ readlink -f /dev/stdin; } <&6
para el caso donde usó exec y eliminó el nodo es/root/secretunknownname (deleted)
. Como muestra que el archivo se eliminó: ¿no es suficiente para lo que necesita?stat
solución es la única que funciona./dev/null
, pero no es necesario. Puede "alias" conmknod
s ilustrado en mi ejemplo.Respuestas:
En Linux, puedes hacerlo con:
En un Linux sin stat (1) (p. Ej., Busybox en su enrutador):
En * bsd:
En sistemas como * BSD y Solaris,
/dev/stdin
,/dev/fd/0
y/proc/PID/fd/0
no son enlaces simbólicos "mágicas" como en Linux, pero los dispositivos de caracteres que colocarán en el archivo real, cuando está abierto . Una estadística (2) en su ruta devolverá algo diferente a una 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 dejar que haga un fstat (2) en el descriptor de archivo 0, al igual que stat (1) de * bsd:También es muy fácil hacer la verificación de forma portátil en cualquier idioma que ofrezca una interfaz para fstat (2), por ejemplo. en
perl
:fuente
/dev/null
es1:3
, puede probarlo de inmediato.stat
comando, ya habría estado bastante satisfecho. No veo el punto de comenzar una guerra de edición entre`
y$(
partidarios. Personalmente, prefiero$(...)
y hay algunas razones POSIX a favor de esa sintaxis ( pubs.opengroup.org/onlinepubs/9699919799/xrat/… ) Pero no veo el punto de rechazar una respuesta correcta para algo que no está relacionado con el pregunta.$( ... )
se prefiere a los backticks en el contexto de esta respuesta?$(..)
estilo se anida más fácilmente y AIUI es el enfoque preferido de POSIX. Ciertamente no tenía la intención de comenzar ninguna forma de guerra de edición, prefiriendo comentar con una sugerencia en lugar de cambiar su excelente respuesta.En Linux, para determinar si la entrada estándar se redirige
/dev/null
, puede verificar si/proc/self/fd/0
tiene el mismo dispositivo e inodo que/dev/null
:Puedes usar en
/dev/stdin
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 dispositivo mayor y menor, por ejemplo utilizando
stat
(vea también la respuesta de mosvy ):o, si no te importa que esto sea específico de Linux ,
fuente
bash -c 'ls -l /proc/self/fd/0 /dev/null; [[ /proc/self/fd/0 -ef /dev/null ]] && echo dev null'
entonces haz eso otra vez con</dev/null
. +1/dev/stdin
ser un enlace simbólico al archivo original es específico de Linux, por lo que todas esas soluciones son específicas de Linux de todos modos. Losstat
basados en requieren GNU o busyboxstat
. Con versiones recientes de GNUstat
, puede utilizarstat -
para hacer unfstat()
fd 0 que luego funcionaría en sistemas que no sean Linux./dev/null
y el dispositivo nulo.Portablemente, para verificar que stdin es el
null
dispositivo (abierto/dev/null
o no (como una copia de/dev/null
)), conzsh
(cuyastat
construcción es anterior a GNU y FreeBSDstat
por cierto (aunque no IRIX ')):(tenga en cuenta que no dice si el descriptor de archivo estaba abierto en modo de solo lectura, solo escritura o lectura + escritura).
Para verificar que esté abierto
/dev/null
específicamente en el archivo actual (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 undup(0)
en otros sistemas):En no Linux, puedes probar:
fuente