(Casi) todo es un archivo, pero no todo es un archivo normal . No tiene sentido llamar a un editor de texto en algo que es un archivo especial como un directorio, un socket de red, un puerto serie, etc.
El archivo /dev/stdout
puede ser una de varias cosas dependiendo de la variante de Unix:
- un archivo "especial", típicamente un dispositivo de caracteres;
- un enlace simbólico "mágico" que apunta al archivo que el proceso que accede a él se ha abierto en este descriptor;
- Un enlace simbólico a uno de los anteriores.
En cualquier caso, abrir /dev/stdout
archivos similares crea un nuevo descriptor de archivo que está asociado con el mismo archivo que la aplicación ya tiene abierto en el descriptor de archivo 1. “Salida estándar” significa el descriptor de archivo 1, y es solo una convención que se utilice este descriptor de archivo para salida: al núcleo no le importa.
Cuando ejecuta un programa en un terminal, los tres descriptores estándar (0 = entrada estándar, 1 = salida estándar, 2 = error estándar) se abren en el dispositivo terminal. La lectura desde ese dispositivo devuelve caracteres escritos por el usuario, y la escritura en ese dispositivo muestra texto en la ventana del terminal. (No existe una forma estándar, dado un dispositivo terminal, de leer la salida que muestra o inyectarle entradas).
Cuando ejecuta cat /dev/stdout
, eso hace exactamente lo mismo que cat /dev/stdin
o cat /dev/stderr
, porque estos tres descriptores de archivo están conectados al mismo archivo: le dice cat
que lea desde el terminal. Eso es lo que cat
sin argumento hace también.
Si ejecutó cat /dev/stdout >foo
, /dev/stdout
se referiría al archivo foo
, ese comando es equivalente a cat foo >foo
. Dependiendo de la cat
implementación, podría producirse un error (la versión de GNU se queja de que "el archivo de entrada es el archivo de salida"), o podría no hacer nada porque lee del archivo foo
que está vacío ( >foo
solo lo truncó). Con una versión de cat
que no detecta este caso especial, si foo
no está vacío, entonces cat /dev/stdout >>foo
o el equivalente cat foo >>foo
agregaría el contenido del archivo a sí mismo indefinidamente.
Cuando ejecuta vim /dev/stdout
, se queja porque no sabe cómo editar un terminal (eso simplemente no tiene sentido).