Shellscripting: Befehlsverkettung

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Shellscripting: Befehlsverkettung

Beitrag von heisenberg » 20.03.2018 10:41:46

Mal eine Anmerkung zu der Art, wie man Befehle verketten kann:

Ich habe für mich das Konstrukt...

Variante 1

Code: Alles auswählen

Befehl_1 | Befehl_2
in den meisten Fällen ersetzt ersetzt durch dieses...

Variante 2

Code: Alles auswählen

Befehle_2 < <(Befehl_1)
Befehl_1 und Befehl_2 können dabei auch durch "|" oder "&&" (oder, oder ...) verkettete Sequenzen sein. Variante 1 ist die kompatible Variante. Variante 2 dürfte nur mit Bash gehen.

Variante 2 hat den Vorteil, dass in der Sequenz Befehl_2 Variablen gesetzt werden können, die erhalten bleiben, während bei Variante 1 diese Variablen in Befehle 2 verworfen werden.

Beispiel

Code: Alles auswählen

max_tempartur=0
get_temperaturen.sh | while read temperatur ; do
  if [ $temperatur -gt $max_temperatur ]  ; then 
      echo "Neue Maximaltemperatur gefunden: $temperatur" 
      max_temperatur=$temperatur
  fi
done 
echo "gefundene Maximaltemperatur: $max_temperatur"
Beim ausprobieren obigen Scriptbeispieles bekommt man Anzeigen, immer, wenn neue Maximaltemperaturen gefunden werden, aber die Ausgabe nach der Schleife bleibt leer, da die Variable max_temperatur nicht in der Hauptshell des Scriptes gesetzt wird und so anschliessend nicht mehr verfügbar ist. Hier ist der Aufruf(nur der Aufruf nicht die Ausführung selbst!) get_temperaturen.sh in der aktuellen Shell und die Schleife ist in einem neu erzeugten Prozess.

Beispiel 2

Code: Alles auswählen

max_tempartur=0
while read temperatur ; do
  if [ $temperatur -gt $max_temperatur ]  ; then 
      echo "Neue Maximaltemperatur gefunden: $temperatur" 
      max_temperatur=$temperatur
  fi
done  < <(get_temperaturen.sh)
echo "gefundene Maximaltemperatur: $max_temperatur"
Beispiel 2 funktioniert, da jetzt die Ausführung umgedreht ist. Jetzt wird die Schleife in der aktuellen Shell ausgeführt und die Scriptausführung von get_temperaturen.sh in einer Subshell.

Im Allgemeinen ist also die Entscheidung, wie man das macht, eine Frage wo man Variablen hat, die man gerne weiter im Hauptprogramm behalten möchte. Falls das benötigt wird, ist das üblicherweise ist das eher im hinteren bzw. letzten Teil der Befehlskette, weil man ja die Kette so aufbaut, dass das hinten rausfällt, was man möchte.

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Shellscripting: Befehlsverkettung

Beitrag von breakthewall » 20.03.2018 11:34:11

Code: Alles auswählen

< <(....)
Diese Bash-Funktionalität ist in der Tat sehr praktisch. Insbesondere weil sie ermöglicht, dass man für einen Prozess in einer Pipe, noch weitere Pipes einrichten kann. Und das obwohl /dev/stdin für jenen Prozess, durch die primäre Pipe eigentlich bereits belegt ist. Das wird mitunter auch Anonymous-Pipe genannt, und ist auch nützlich um bspw. Passwörter an Prozesse zu übergeben, ohne das jene Passwörter in der Kommandozeile via ps, top etc. global sichtbar sind. Praktisch ist ebenfalls, dass nur der jeweilige Prozess die Daten der damit verbundenen Anonymous-Pipe auslesen kann, und diese nur solange existiert wie der damit verbundene Prozess. Das kann also recht flexibel eingesetzt werden.

AmitShah
Beiträge: 1
Registriert: 27.03.2018 09:12:24

Re: Shellscripting: Befehlsverkettung

Beitrag von AmitShah » 27.03.2018 09:20:51

The replacement of Command_1 and Command_2 can be done by "|" or "&&" . Rather than that the loop execution takes place it would be great if one can go for script execution and chain command.

Antworten