(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/stdout
può 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/stdout
e 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/stdin
o cat /dev/stderr
, perché questi tre descrittori di file sono collegati allo stesso file: dice cat
di leggere dal terminale. Ecco cosa cat
fa anche senza alcun argomento.
Se hai eseguito cat /dev/stdout >foo
, /dev/stdout
farebbe riferimento al file foo
- quel comando è equivalente a cat foo >foo
. A seconda cat
dell'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 foo
vuoto ( >foo
appena troncato). Con una versione cat
che non rileva questo caso speciale, se foo
non è vuoto, cat /dev/stdout >>foo
o l'equivalente cat foo >>foo
aggiungerebbe 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).