GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie vermeidet ein Shell-Skript die Sigpipe, die durch die Verwendung eines geschlossenen Dateideskriptors verursacht würde?

Ein Shell-Skript kann seine Standard- und andere Dateideskriptoren verlieren, wenn das andere Ende wegfällt. Eine Möglichkeit, dies zu erreichen, ist das Beenden eines ssh Client zum Starten des Skripts:

$ ssh localhost test
^C

Dies startet eine bash Skript namens test über SSH und ein Ctrl C wird verwendet, um ssh zu beenden Befehl. test wird dadurch nicht beendet die weiter läuft, aber die angehängten Dateideskriptoren schließt (z. B. Standard-Eingabe/Ausgabe/Fehler).

Wenn test versucht, diese geschlossenen Dateideskriptoren zu verwenden, dann wird es mit einem SIGPIPE beendet . Ein einfaches echo reicht aus.

Eines der Dinge test haben könnte, ist ein log Funktion, die echo verwendet um Nachrichten in das systemd-Journal und auch in den Standardfehler zu schreiben. Etwa so:

log() {
 echo "$*" | systemd-cat -t test
 echo >&2 "$*"
}

Das zweite echo löst ein SIGPIPE aus nach dem ssh Sitzung beendet (Ctrl C ). Dagegen kann geschützt werden, sodass die Ausführung ohne das störende echo fortgesetzt wird , indem Sie das echo setzen in einer Subshell:

( echo >&2 "$*" )

Aber gibt es einen besseren Weg?

Akzeptierte Antwort:

Sie können SIGPIPE im Skript ignorieren, wenn Sie möchten:

trap "" PIPE

Linux
  1. Wie erstelle ich eine temporäre Datei im Shell-Skript?

  2. Wie fügt man Daten an den Puffer im Shell-Skript an?

  3. Wie bekomme ich den Namen des aktuellen Git-Zweigs in eine Variable in einem Shell-Skript?

  4. So schließen Sie eine Datei in ein Bash-Shell-Skript ein

  5. So führen Sie ein Shell-Skript beim Start aus

So verwenden Sie den Linux-diff-Befehl

So verwenden Sie Variablen in Shell-Skripten

So verwenden Sie Sudo und die Sudoers-Datei

So verwenden Sie den Linux-Befehl ftp zum Hoch- und Herunterladen von Dateien auf der Shell

So verwenden Sie Bash-Dateitestoperatoren in Linux

Wie verwende ich den Gzip-Befehl unter Linux?