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 exec
genauso 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 ls
fü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 bash
Manpage:
exec [-cl] [-a name] [command [arguments]]
Wenn
command
angegeben ist, ersetzt es die Shell. Es wird kein neuer Prozess erstellt.[...]
Wenn
command
nichts 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 ls
an exec
die Standardeingabe, nicht als Argument. exec
wird 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 ) exec
tun :source
.
source exec_test
Rohr zuxargs exec
Das nächste, was Sie versuchten
cat exec_test | xargs exec
exec
ist ein Schlageingebaut. Es ist nur innerhalb von Bash verfügbar, daher xargs
kann ich es nicht finden, um es auszuführen.
exec
in der Hauptschale
Schließlich hast du versucht
exec ls
Dies wurde ausgeführt ls
und ließ das Terminal hängen. Das liegt daran, dass es, wie dokumentiert, den Shell-Prozess ersetzt hat. Sobald es ls
abgeschlossen 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 ls
Anschließend wird diese Shell ersetzt und beendet. Anschließend wird die übergeordnete Shell fortgesetzt, sodass Sie nicht mit einem hängengebliebenen Terminal zurückbleiben.