Rohr zuexec

Rohr zuexec

Ich bin nicht besonders vertraut mit exec. Ich habe einige Tests und Beispiele durchgespielt. Ich wollte einen in einer Datei geschriebenen Befehl an ihn übergeben. Ich erwarte, dass dieser Befehl execgenauso ausgeführt wird, als ob er direkt in der Befehlszeile ausgeführt würde. Folgendes habe ich eingerichtet und ausprobiert:

[kellyry@ch12ldvela00 ~]$ cat exec_test
ls
[kellyry@ch12ldvela00 ~]$ cat exec_test | exec
[kellyry@ch12ldvela00 ~]$ cat exec_test | xargs exec
xargs: exec: No such file or directory
[kellyry@ch12ldvela00 ~]$ exec ls
exec_test            file2             file3
. . .          

Und hier kommt der seltsamste Teil. Die Ausführung der letzten Zeile exec lsführt nicht zu einem Ergebnis. Das heißt, das Terminal hängt und ich kann nicht mit ihm kommunizieren. Ich denke, dieses letzte Problem könnte ein Problem mit Mobaxterm sein, das ich für die SSH-Anmeldung zum Server verwende.

Antwort1

Aus der bashManpage:

exec [-cl] [-a name] [command [arguments]]

Wenn commandangegeben ist, ersetzt es die Shell. Es wird kein neuer Prozess erstellt.

[...]

Wenn commandnichts angegeben ist, werden alle Umleitungen in der aktuellen Shell wirksam und der Rückgabestatus ist 0.

Rohr zuexec

Das erste, was Sie versucht haben, war

cat exec_test | exec

Dies sendet lsan execdie Standardeingabe, nicht als Argument. execwird ohne Argumente ausgeführt und hat keine Umleitungen, also passiert nichts.

Wenn Sie die Befehle in der Datei ausführen möchten, ist das nicht das Ziel . Sie können das mit (oder der Abkürzung ) exectun :source.

source exec_test

Rohr zuxargs exec

Das nächste, was Sie versuchten

cat exec_test | xargs exec

execist ein Schlageingebaut. Es ist nur innerhalb von Bash verfügbar, daher xargskann ich es nicht finden, um es auszuführen.

execin der Hauptschale

Schließlich hast du versucht

exec ls

Dies wurde ausgeführt lsund ließ das Terminal hängen. Das liegt daran, dass es, wie dokumentiert, den Shell-Prozess ersetzt hat. Sobald es lsabgeschlossen ist, läuft im Terminal nichts mehr. (Einige Terminalemulatoren schließen sich an dieser Stelle automatisch. Glücklicherweise wurde Ihr Terminal nicht geschlossen, sodass Sie die Ausgabe noch sehen konnten.)

DerBeispiel, dem Sie folgen wolltenhatte einen zusätzlichen Schritt:

bash
exec ls

Dadurch wird zunächst eine neue gestartet bash, die als untergeordnete Shell der „obersten“ Shell ausgeführt wird. exec lsAnschließend wird diese Shell ersetzt und beendet. Anschließend wird die übergeordnete Shell fortgesetzt, sodass Sie nicht mit einem hängengebliebenen Terminal zurückbleiben.

verwandte Informationen