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.

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top