(Quasi) tutto è un file ma non tutto è un file normale . Non ha senso chiamare un editor di testo su qualcosa che è un file speciale come una directory, un socket di rete, una porta seriale, ecc.
Il file /dev/stdoutpuò essere una delle varie cose a seconda della variante unix:
- un file "speciale", in genere un dispositivo a caratteri;
- un collegamento simbolico "magico" che punta al file che il processo che accede ad esso ha aperto su questo descrittore;
- un collegamento simbolico a uno dei precedenti.
In ogni caso, l'apertura /dev/stdoute file simili creano un nuovo descrittore di file associato allo stesso file che l'applicazione ha già aperto sul descrittore di file 1. "Output standard" significa descrittore di file 1, ed è solo una convenzione che questo descrittore di file viene utilizzato per l'output: al kernel non importa.
Quando si esegue un programma in un terminale, tutti e tre i descrittori standard (0 = input standard, 1 = output standard, 2 = errore standard) vengono aperti sul dispositivo terminale. La lettura da quel dispositivo restituisce i caratteri digitati dall'utente e la scrittura su quel dispositivo visualizza il testo nella finestra del terminale. (Non esiste un modo standard, dato un dispositivo terminale, per leggere l'output che mostra o per iniettare l'input in esso.)
Quando esegui cat /dev/stdout, questo fa esattamente la stessa cosa di cat /dev/stdino cat /dev/stderr, perché questi tre descrittori di file sono collegati allo stesso file: dice catdi leggere dal terminale. Ecco cosa catfa anche senza alcun argomento.
Se hai eseguito cat /dev/stdout >foo, /dev/stdoutfarebbe riferimento al file foo- quel comando è equivalente a cat foo >foo. A seconda catdell'implementazione, potrebbe fuoriuscire un errore (la versione GNU si lamenta che "il file di input è un file di output") o potrebbe non fare nulla perché legge dal file foovuoto ( >fooappena troncato). Con una versione catche non rileva questo caso speciale, se foonon è vuoto, cat /dev/stdout >>fooo l'equivalente cat foo >>fooaggiungerebbe il contenuto del file a se stesso indefinitamente.
Quando corri vim /dev/stdout, si lamenta perché non sa come modificare un terminale (non ha proprio senso).