Perché "awk ... file | tee file ”tronca il file? [duplicare]
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
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