comprensione del reindirizzamento della shell su file inesistenti
-
07-07-2019 - |
Domanda
ls > ls.out
questo includerà anche ls.out nell'elenco. La mia comprensione è: > (l'operatore di reindirizzamento dell'output della shell sta creando prima un file (per eseguire STDOUT) se non è già esistente e quindi il comando ls sta per essere riprodotto e include il file ls.out appena creato nell'output. È corretto? Altrimenti, puoi per favore elaborare il funzionamento di quel comando.
Allo stesso modo
wc temp > temp
Stampa 0 0 0 temp all'interno del file temporaneo appena creato.
Questo comportamento della shell è interessante. Mi chiedo come funzioni davvero. A proposito, entrambi sono esercizi in The Unix Programming Environment Book. Come ho detto la risposta sopra, voglio che qualche esperto corregga la mia comprensione.
Soluzione
Quando reindirizza l'output standard con >
, la shell creerà il file (come file vuoto) se non esiste già. Inoltre, quel file viene aperto prima che la shell esegua il fork ed esegue il comando in esecuzione. Quando fai wc temp > temp
, la shell apre il file per la scrittura, quindi esegue il fork e esegue wc
, passando gli handle di file aperti nel processo.
Altri suggerimenti
Troppo semplice:
ls
sta guardando l'inode (voce della directory) che il reindirizzamento ha creato.
wc
può vedere l'inode creato dal reindirizzamento, ma quando guarda i contenuti sono vuoti perché ( wc
) non li ha ancora scritti.
Modifica:
Innanzitutto, in entrambi i casi, il reindirizzamento ( > ls.out
o > temp
) crea un file vuoto. Viene creata una voce (inode) nella directory per indicare la posizione del file e contenere alcune informazioni al riguardo. Vedi l'articolo di Wikipedia su inode .
Successivamente, nel caso di ls
, tutte le voci nella directory, inclusa quella per ls.out
che è stata appena creata , vengono letti e scritti in stdout
(che in questo caso diventa il contenuto di ls.out
).
Oppure, nel caso di wc
, conta i conteggi di nuova riga, parola e byte del file creato di recente chiamato temp
che è vuoto quindi scrive i conteggi zero nel file dopo conta (nulla).
Il contenuto dei file ( temp
o ls.out
) non viene scritto fino a quando non viene eseguita tutta la lettura, quindi non possono essere stati inclusi.
Per un modo migliore di confrontare cosa stanno facendo ls
e wc
, prova questo comando (quando ls.out è inesistente):
ls -l > ls.out
Dovresti vedere che la dimensione del file per ls.out
è zero in base all'elenco contenuto all'interno ( cat ls.out
), ma se fai ls -l ls.out
vedrai che non è zero. Ciò corrisponde a ciò che vedi accadere con wc
.
considera wc -l temp > temp
Se temp
esisteva già e diceva che 20 righe sono ancora il risultato di cat temp
dopo aver eseguito il comando sopra, sarà 0 temp.
Penso che questo sia perché la shell crea un nuovo temp
vuoto anche se temp
esisteva sovrascrivendo così il temp esistente e quindi quando wc
prova per contare il numero di righe in temp
diventa zero.
In effetti > temp
viene prima eseguito dalla shell e poi wc -l temp
.