Perché il reindirizzamento allo stesso file tronca il file?


11

Normalmente utilizziamo un file diverso per reindirizzare l'output.

Per esempio :

cat < first > temp

In questo comando i contenuti di first vengono reindirizzati a temp anziché allo standard output.

Quindi perché tronca il file se utilizzo lo stesso nome file?

Perché non può sovrascrivere lo stesso file?

cat < first > first 

Risposte:


19

Quando si utilizza il reindirizzamento I / O in questo modo, entrambi i file "input" e "output" vengono aperti dalla shell prima dell'esecuzione del comando. E aprire un file per sovrascrivere equivale a troncarlo prima di scrivere. Il risultato: catvede un file vuoto sull'input ...


0

Perché gestirlo nel caso generale sarebbe molto complicato. Considera solo il seguente esempio:

Un programma legge un file riga per riga e genera ogni riga due volte. Ora, affinché funzioni senza un secondo file (cioè sullo stesso file), il programma dovrebbe bufferizzare la maggior parte (tutte) delle righe che leggerà, poiché verranno sovrascritte altrimenti prima che possano essere lette.

Per mantenere le cose, i semplici programmi di solito usano un file temporaneo secondario che si sposta sull'originale una volta terminato. Questo è ad esempio il modo in cui sed -i(inline) funziona.


0

In genere, la sintassi per il reindirizzamento in questo caso dovrebbe essere cat first > temp. Ciò significa che catl'output di firstviene inviato al file di temp. Nel caso della tua dichiarazione cat < first > temp, l'output catnon è stato completato nel momento in cui viene reindirizzato nuovamente. Niente in risulta in nulla.

Tuttavia, l' catinging di un file e l'output reindirizzato a un altro file non sono diversi da quelli di base cp.


cat < first > tempfunziona benissimo.
JanC
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.