(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/stdoutpuede 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/stdoutarchivos 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/stdino cat /dev/stderr, porque estos tres descriptores de archivo están conectados al mismo archivo: le dice catque lea desde el terminal. Eso es lo que catsin argumento hace también.
Si ejecutó cat /dev/stdout >foo, /dev/stdoutse referiría al archivo foo, ese comando es equivalente a cat foo >foo. Dependiendo de la catimplementació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 fooque está vacío ( >foosolo lo truncó). Con una versión de catque no detecta este caso especial, si foono está vacío, entonces cat /dev/stdout >>fooo el equivalente cat foo >>fooagregarí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).