reindirizzamento del gatto


11

Supponiamo che un file chiamato abcesista nella directory corrente e contenga del testo. Quando si esegue il comando:

cat abc > abc

Perché il contenuto del file abcscompare?
Perché il comando elimina il testo al suo interno e il file diventa un file vuoto?



10
Un puntatore laser è uno strumento molto efficace per il reindirizzamento del gatto. </pun>
WBT,

Il mio gatto risponde molto male al reindirizzamento ...
Ex Umbris,

Per evitare questo problema, uso un piccolo shellscript che ho chiamato cane :cat abc | dog abc
joeytwiddle

Un'altra opzione, se non ti dispiace l'output sullo schermo, è quella di utilizzare tee.
Andrea Lazzarotto,

Risposte:


27

A causa dell'ordine come vengono fatte le cose.

Quando lo fai:

cat abc > abc

>è l'operatore di reindirizzamento dell'output, quando la shell lo vede apre il file in modalità troncamento usando O_TRUNCflag con open(2)ie open("abc", O_TRUNC), quindi qualsiasi cosa fosse presente nel file sparirà. Si noti che questo reindirizzamento viene eseguito prima dalla shell prima dell'esecuzione del catcomando.

Quindi, quando il comando cat abcviene eseguito, il file abcè già troncato, quindi catil file verrà trovato vuoto.


1
Che dire di cat abc >> abc? Cosa succede allora?
Tulsi Kanodia,

2
@TulsiKanodia - che provoca un ciclo infinito. Ogni volta che il gatto legge una riga, ne aggiunge un'altra prima di passare alla successiva.
user3490,

3
Questo viene rilevato e prevenuto. Invece, il testo cat: filename: input file is output file(dove si filenametrova il nome file scelto) viene stampato sul vecchio stdout.
UTF-8,


5

Aggiungendo alla risposta di @emeemayl , se vuoi che il codice sia più chiaro sulla sequenza in cui stanno accadendo le cose, puoi semplicemente mettere tutti i reindirizzamenti all'inizio del comando:

> abc cat abc
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.