GNU/Linux >> Linux Esercitazione >  >> Linux

In che modo uno script di shell evita il Sigpipe che sarebbe causato dall'uso di un descrittore di file chiuso?

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

Linux
  1. Come utilizzare il comando Tar in Linux

  2. Come creare un file temporaneo nello script della shell?

  3. Echo To File Descriptor sovrascrive il file?

  4. Come ottenere il nome dell'attuale ramo git in una variabile in uno script di shell?

  5. Come eseguire uno script di shell all'avvio

Come usare il comando diff di Linux

Come utilizzare le variabili negli script della shell

Come usare Sudo e il file Sudoers

Come utilizzare il comando ftp di Linux per caricare e scaricare file sulla shell

Come utilizzare gli operatori di test di file Bash in Linux

Come utilizzare il comando Gzip in Linux?