De vez en cuando necesito especificar un "camino equivalente" de una de las corrientes de IO estándar ( stdin
, stdout
, stderr
). Como el 99% del tiempo trabajo con Linux, solo prefiero /dev/
obtener /dev/stdin
, etc., y esto " parece hacer lo correcto". Pero, por un lado, siempre me ha inquietado esa razón (porque, por supuesto, "parece funcionar" hasta que no funciona). Además, no tengo un buen sentido de lo portátil que es esta maniobra.
Entonces tengo algunas preguntas:
En el contexto de Linux, ¿es seguro (sí / no) a equiparar
stdin
,stdout
ystderr
con/dev/stdin
,/dev/stdout
y/dev/stderr
?En términos más generales, ¿es esta equivalencia "adecuadamente portátil "?
No pude encontrar ninguna referencia POSIX.
Respuestas:
Ha estado disponible en Linux nuevamente en su prehistoria. Es no POSIX, aunque muchas conchas reales (incluyendo AT & T
ksh
ybash
) simulará que si no está presente en el sistema operativo; tenga en cuenta que esta simulación solo funciona a nivel de shell (es decir, redirección o parámetro de línea de comando, no como argumento explícito para, por ejemploopen()
). Dicho esto, debería estar disponible en la mayoría de los sistemas comerciales de Unix, de una forma u otra (a veces se deletrea/dev/fd/N
para varios enterosN
, pero la mayoría de los sistemas con eso proporcionarán enlaces simbólicos como Linux y * BSD).fuente
/dev/std{in,out,err}
se enumeran específicamente como parte del estándar POSIX.1-2008 .ash
no es compatible/dev/stdout
con initrd ( git.razvi.ro/… )los
/dev/std{in,out,err}
archivos normalmente son solo enlaces simbólicos a/proc/self/fd/{0,1,2}
(respectivamente). Como tal, no se gana nada con el uso de métodos definidos por POSIX.Si desea cumplir con POSIX, la mejor manera de hacerlo es utilizar la redirección de salida. La redirección de salida de Shell se define en el estándar POSIX . Además, los números de descriptor de archivo STDIN, STDOUT, STDERR también forman parte de POSIX .
En resumen, cosas como
>&2
están garantizadas para trabajar.Sin embargo, una cosa importante a tener en cuenta es que el uso de STDIN, STDOUT y STDERR es subjetivo de cómo se inició el programa. Si el programa se inició con el descriptor de archivo 1 como un controlador abierto para un archivo, entonces su programa solo tiene que aceptarlo. Incluso si tuviera que abrir el programa
/dev/stdout
, todo lo que haría sería abrir el descriptor de archivo 1, que todavía apuntará a ese archivo.Si esto es lo que está tratando de evitar, debe abrir el TTY directamente. Normalmente, sin ninguna redirección, STDIN, STDOUT y STDERR son descriptores de archivos abiertos que apuntan al mismo TTY. No hay absolutamente nada más que eso.
fuente
/proc/self/fd/1
o/dev/fd/1
son parte de POSIX?/dev/std???
son solo enlaces simbólicos/proc/self/fd
en Linux.POSIX 7 dice que son extensiones.
Definiciones básicas , Sección 2.1.1 Requisitos:
Encontrado por grep el HTML POSIX: ¿Dónde está la lista de las funciones API POSIX C?
También bastante extraño, la
uuencode
herramienta da/dev/stdout
un efecto mágico :La documentación del kernel de Linux dice que todos los sistemas deberían tenerlo.
https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/devices.rst
Sin embargo, no pude encontrar dónde se crean esos enlaces simbólicos en el núcleo (¿se proporciona la distribución?).
fuente
/ dev / {stdout, stdin, stderr} funcionan en Bash en estas plataformas:
Pero falla en csh en estos:
fuente
bash
es especial, ya que se puede compilar para manejarlo/dev/fd/x
solo para redireccionamientos en sistemas que no tienen/dev/fd
Un problema con
/dev/stdout
y amigos es que es posible que no tenga permiso para escribirles en determinadas circunstancias. Por ejemplo, me he encontrado con esto al invocar scripts de Nix , e imagino herramientas similares que ejecutan scripts en cárceles / sandboxes / container / VMs / etc. puede encontrar problemas similares.Usar la sintaxis como
1>&2
funcionó en estos casos y, dado que sabía que estaría ejecutando en Bash, podría usar la sustitución de procesos para los comandos que esperan nombres de archivo.fuente