GNU/Linux >> Znalost Linux >  >> Linux

Jak na skript Shell vyhnout se Sigpipe, který by byl způsoben použitím uzavřeného deskriptoru souboru?

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

Linux
  1. Jak používat příkaz Tar v Linuxu

  2. Jak vytvořit dočasný soubor ve skriptu Shell?

  3. Echo To File Descriptor přepíše soubor?

  1. Jak připojit data do vyrovnávací paměti ve skriptu Shell?

  2. Jak získat název aktuální větve git do proměnné v shell skriptu?

  3. Jak mohu použít řádky souboru jako argumenty příkazu?

  1. Jak zahrnout soubor do skriptu bash shell

  2. Jak spustit skript shellu při spuštění

  3. Jak spustit soubor bez přípony .sh v shellu