Wie führe ich einen Befehlsblock in der Hauptshell aus?

Wie führe ich einen Befehlsblock in der Hauptshell aus?

Ich versuche, eine Reihe von Befehlen als Ganzes innerhalb der Haupt-Shell auszuführen, aber die Methode, die mir beigebracht wurde, funktioniert nur innerhalb der Unter-Shell:

Antwort1

Kommt drauf an, was du meinstals Ganzes.

Wenn Sie lediglich mehrere Befehle an die Shell senden und sicherstellen möchten, dass die Shell diese erst ausführt, wenn Sie sie alle eingegeben haben, können Sie Folgendes tun:

cmd1; cmd2

Oder

Befehl1 Ctrl+VCtrl+JBefehl2

(oder aktivieren Sie die Funktion „Einfügen in Klammern“ ( bind 'set enable-bracketed-paste on') und fügen Sie die Befehle von einem Terminal ein, das Einfügen in Klammern unterstützt).

Oder:

{
cmd1
cmd2
}

Um sie auf mehreren Zeilen zu haben.

Wenn Sie sie so gruppieren möchten, dass sie beispielsweise denselben Standard-DIN oder Standard-OUT verwenden, können Sie Folgendes verwenden:

{ cmd1; cmd2; } < in > out

Oder

eval 'cmd1; cmd2' < in > out

Wenn Sie möchten, dass sie mit ihrem eigenen Variablen- und Optionsbereich ausgeführt werden, da bashes nicht das Äquivalent zshanonymer Funktionen gibt, müssen Sie eine temporäre Funktion definieren:

f() { local var; var=foo; bar;}; f

Antwort2

Anstelle von , das in einer Untershell ( something )startet , verwenden Sie , das in der aktuellen Shell startetsomething{ something ; }something

Sie benötigen Leerzeichen nach dem {und sollten auch ein ;(oder eine neue Zeile) vor dem haben }.

Ex:

$ { echo "hello $BASHPID";sleep 5;echo "hello again $BASHPID" ; }
hello 3536
hello again 3536

Beachten Sie jedoch, dass sich einige komplexe Befehle (oder weitergeleitete Befehle) beim Starten meistens ohnehin in einer Subshell befinden.

Und die „portable“ Möglichkeit, die PID Ihrer aktuellen Shell zu erhalten, ist $$.

Daher würde ich Ihren Test stattdessen wie folgt schreiben:

{ echo "hello $$"; sleep 5 ; echo "hello again $$" ; }

(der Schlaf ist hier sowieso nicht wirklich nützlich)

verwandte Informationen