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