Uno script di shell può perdere il suo standard e altri descrittori di file se l'altra estremità scompare. Un modo in cui ciò può accadere è terminare un ssh client utilizzato per avviare lo script:
$ ssh localhost test
^C
Questo lancia un bash script chiamato test su SSH e un Ctrl C viene utilizzato per terminare ssh comando. Questo non termina il test che continua a funzionare ma chiude i descrittori di file allegati (ad esempio input/output/errore standard).
Se test tenta di utilizzare quei descrittori di file chiusi, quindi terminerà con un SIGPIPE . Un semplice echo sarà sufficiente.
Una delle cose test potrebbe avere è un log funzione che utilizza echo per scrivere messaggi nel diario di sistema e anche in standard error. Qualcosa del genere:
log() {
echo "$*" | systemd-cat -t test
echo >&2 "$*"
}
Il secondo echo genera un SIGPIPE dopo il ssh la sessione viene terminata (Ctrl C ). Questo può essere protetto, in modo che l'esecuzione continui senza l'offensivo echo , inserendo echo in una subshell:
( echo >&2 "$*" )
Ma c'è un modo migliore?
Risposta accettata:
Potresti se vuoi ignorare SIGPIPE nello script:
trap "" PIPE