Quel messaggio viene emesso su stderr come tutti i messaggi di avviso e di errore.
Puoi eliminare tutto l'output dell'errore:
tail -f file 2> /dev/null
O per filtrare solo i messaggi di errore che contengono truncate
:
{ tail -f file 2>&1 >&3 3>&- | grep -v truncated >&2 3>&-;} 3>&1
Ciò significa tuttavia che si perde lo stato di uscita di tail
. Alcune shell hanno pipefail
un'opzione (abilitata con set -o pipefail
) per quella pipeline per segnalare lo stato di uscita tail
se fallisce. zsh
e bash
può anche segnalare lo stato dei singoli componenti della pipeline nel loro $pipestatus
/ $PIPESTATUS
array.
Con zsh
o bash
, puoi usare:
tail -f file 2> >(grep -v truncated >&2)
Ma attenzione che il grep
comando non è atteso, quindi i messaggi di errore se presenti potrebbero essere visualizzati dopo essere tail
usciti e la shell ha già iniziato a eseguire il comando successivo nello script.
In zsh
, puoi affrontarlo scrivendolo:
{ tail -f file; } 2> >(grep -v truncated >&2)
Questo è discusso nella zsh
documentazione all'indirizzo info zsh 'Process Substitution'
:
C'è un ulteriore problema con >(PROCESS)
; quando questo è collegato a un comando esterno, la shell padre non attende il completamento di PROCESS e quindi un comando immediatamente successivo non può fare affidamento sul completamento dei risultati. Il problema e la soluzione sono gli stessi descritti nella sezione MULTIOS nella nota Reindirizzamento :: . Quindi in una versione semplificata dell'esempio sopra:
paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)
(si noti che non sono coinvolti MULTIOS), PROCESS verrà eseguito in modo asincrono per quanto riguarda la shell madre. La soluzione è:
{ paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)
I processi extra qui vengono generati dalla shell genitore che attenderà il loro completamento.
(
)
rispetto a un comando complesso{
}
?