Te damos la respuesta a este asunto, al menos eso pensamos. Si tienes interrogantes dínoslo y sin dudarlo te responderemos
Solución:
Ha estado disponible en Linux desde su prehistoria. Está no POSIX, aunque muchos proyectiles reales (incluido AT&T ksh
y bash
) lo simulará 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 ejemplo, open()
). Dicho esto, debería estar disponible en la mayoría sistemas Unix comerciales, de una forma u otra (a veces se escribe /dev/fd/N
para varios enteros N
pero la mayoría de los sistemas con eso proporcionarán enlaces simbólicos como lo hacen Linux y *BSD).
la /dev/stdin,out,err
los archivos son normalmente 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 usar 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 garantizados para trabajar.
Sin embargo, una cosa importante a tener en cuenta es que el uso de STDIN, STDOUT y STDERR depende de cómo se inició el programa. Si el programa se inició con el descriptor de archivo 1 siendo un identificador 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 es abrir el descriptor de archivo 1 que aún 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 solo descriptores de archivos abiertos que apuntan al mismo TTY. No hay absolutamente nada más que eso.
POSIX 7 dice que son extensiones.
Definiciones básicas, requisitos de la sección 2.1.1:
El sistema puede proporcionar extensiones no estándar. Estas son funciones que POSIX.1-2008 no exige y pueden incluir, entre otras:
[…]
- Archivos especiales de caracteres adicionales con propiedades especiales (por ejemplo,
/dev/stdin
,/dev/stdout
y/dev/stderr
)
Encontrado al hacer grepping en el HTML de POSIX: ¿Dónde está la lista de funciones de la API de POSIX C?
También extrañamente, el uuencode
herramienta da/dev/stdout
un efecto mágico:
Especificando un decode_pathname operando de
/dev/stdout
indicará que uudecode debe usar salida estándar.
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
Compulsory links
These links should exist on all systems:
/dev/fd /proc/self/fd symbolic File descriptors
/dev/stdin fd/0 symbolic stdin file descriptor
/dev/stdout fd/1 symbolic stdout file descriptor
/dev/stderr fd/2 symbolic stderr file descriptor
Sin embargo, no pude encontrar dónde se crean esos enlaces simbólicos en el kernel (¿se proporciona la distribución?).
Sección de Reseñas y Valoraciones
Si crees que ha sido de utilidad este post, sería de mucha ayuda si lo compartes con otros juniors y nos ayudes a extender nuestra información.