Perché "awk ... file | tee file ”tronca il file? [duplicare]

Sep 20 2020

Perché questa pipeline tronca il file:

awk '...' file | tee file

mentre catin primo luogo non lo fa?

cat file | awk '...' | tee file

Il file è solo un normale file di configurazione con centinaia di righe. E io uso teeper evitare di usare sponge(dato che devo installare moreutilsprima).

Risposte

10 LjmDullaart Sep 21 2020 at 06:37

Scoprirai a lungo termine che questo comportamento non è coerente.

Il problema è che teea un certo punto nel tempo il file viene aperto in scrittura. Da quel momento in poi, il file viene troncato. Questo è indipendente dal programma che legge il file.

Succede solo che catè molto veloce e che la lettura del file apparentemente è stata terminata prima di teeaprire il file. Ma se ad esempio il carico di sistema è maggiore, catpotrebbe non essere stato completato e la pipeline catpotrebbe anche essere troncata.

Quindi, non scrivere nello stesso file da cui stai leggendo la pipeline. Invece usare Gnu awks' -i inplace, o se questo non è disponibile sul sistema, l'uso

cp file file.tmp &&
awk '...' file.tmp | tee file