Shell skript může ztratit své standardní a další deskriptory souborů, pokud druhý konec zmizí. Jedním ze způsobů, jak k tomu může dojít, je ukončení ssh
klient použitý ke spuštění skriptu:
$ ssh localhost test
^C
Tím se spustí bash
skript s názvem test
přes SSH a Ctrl C se používá k ukončení ssh
příkaz. Tím se test
neukončí který pokračuje v běhu, ale zavře připojené deskriptory souboru (např. standardní vstup/výstup/chyba).
Pokud test
pokusí použít tyto uzavřené deskriptory souborů, pak to skončí s SIGPIPE
. Jednoduché echo
bude stačit.
Jedna z věcí test
může mít je log
funkce, která používá echo
k zápisu zpráv do žurnálu systemd a také ke standardní chybě. Něco jako toto:
log() {
echo "$*" | systemd-cat -t test
echo >&2 "$*"
}
Druhý echo
vyvolá SIGPIPE
za ssh
relace je ukončena (Ctrl C ). Proti tomu lze chránit, takže provádění pokračuje bez obtěžujícího echo
, vložením echo
v podskořápce:
( echo >&2 "$*" )
Existuje však lepší způsob?
Přijatá odpověď:
Pokud chcete, můžete SIGPIPE ve skriptu ignorovat:
trap "" PIPE