Einführung
Das Linux exec
Befehl führt einen Shell-Befehl aus, ohne einen neuen Prozess zu erstellen. Stattdessen ersetzt es die derzeit geöffnete Shell-Operation. Je nach Verwendung des Befehls exec
hat unterschiedliche Verhaltensweisen und Anwendungsfälle.
Dieser Artikel demonstriert die Verwendung von exec
Befehl unter Linux.
Voraussetzungen
- Zugriff auf die Befehlszeile/das Terminal als sudo.
- Grundlegendes Verständnis von Linux-Terminalbefehlen (verwenden Sie unseren Linux-Befehls-Spickzettel).
- Ein Linux-Texteditor wie nano.
Linux exec-Befehlssyntax
Die exec
Befehlssyntax ist:
exec [options] [command [arguments]] [redirection]
Je nach Anzahl der Argumente verhält sich der Befehl unterschiedlich:
- Wenn ein Argument vorhanden ist, wird
exec
Befehl ersetzt die aktuelle Shell durch das ausgeführte Programm. In einem Bash-Skript werden alle nachfolgenden Befehle nicht ausgeführt . - Wenn kein Befehlsargument vorhanden ist, erfolgen alle Umleitungen in der aktuellen Shell.
Die exec
Der Befehl kehrt nie zum ursprünglichen Prozess zurück, es sei denn, es liegt ein Fehler vor oder der Befehl wird in einer Subshell ausgeführt.
Linux-exec-Befehlsoptionen
Nachfolgend finden Sie eine kurze Erklärung aller exec
Optionen:
Option | Beschreibung |
---|---|
-c | Führt den Befehl in einer leeren Umgebung aus. |
-l | Übergibt einen Bindestrich (- ) als nulltes Argument. |
-a [name] | Besteht [name] als nulltes Argument. |
Lesen Sie weiter, um zu sehen, wie exec
funktioniert anhand von Beispielen.
Linux exec-Befehlsbeispiele
Die folgenden Beispiele demonstrieren das Verhalten von exec
Befehl im Terminal und über Bash-Skripte.
Grundlegende Verwendung (Prozessersetzung)
Um zu sehen, wie exec
funktioniert, gehen Sie wie folgt vor:
1. Öffnen Sie das Terminal und listen Sie die laufenden Prozesse auf:
ps
Die Ausgabe zeigt die aktuell ausgeführte Bash-Shell und den ps
Befehl. Die Bash-Shell hat eine eindeutige PID.
2. Überprüfen Sie zur Bestätigung die aktuelle Prozess-ID mit:
echo $$
Die PID ist dieselbe wie die Ausgabe von ps
Befehl, der anzeigt, dass dies der aktuell laufende Bash-Prozess ist.
3. Führen Sie nun exec
aus und übergeben Sie den Schlafbefehl für hundert Sekunden:
exec sleep 100
Die sleep
Befehl wartet 100 Sekunden.
4. Listen Sie in einem anderen Terminal-Tab alle derzeit laufenden Prozesse auf und suchen Sie nach sleep
Befehl:
ps -ae | grep sleep
Die PID für den Prozess ist dieselbe wie die Bash-Shell-PID und gibt exec
an Befehl ersetzte den Bash-Shell-Prozess.
Die Bash-Sitzung (Terminal-Tab) wird geschlossen, wenn die 100 Sekunden abgelaufen sind und der Prozess endet.
Aktuelle Shell-Sitzung ersetzen
Verwenden Sie den exec
Befehl zum Ersetzen der aktuellen Shell-Sitzung:
1. Überprüfen Sie die aktuelle Shell-PID:
echo $$
2. Verwenden Sie exec
um zur Bourne Shell zu wechseln:
exec sh
3. Überprüfen Sie in einem anderen Tab die PID für den Bourne-Shell-Prozess:
ps -ae | grep "\bsh\b"
Hinweis: Der \b
in grep
ist Regex zum Abgleichen von Wortgrenzen, was eine exakte Übereinstimmung von sh
ermöglicht in der Ausgabe. Erfahren Sie mehr in unserem Grep Regex-Tutorial.
Der Befehl ersetzt den Bash-Prozess. Beim Beenden der Bourne-Shell wird die Terminalsitzung vollständig beendet.
Programmaufrufe mit exec in Bash-Skripten
Um zu sehen, wie exec
in Bash-Skripten funktioniert, gehen Sie wie folgt vor:
1. Öffnen Sie einen Texteditor wie Nano und erstellen Sie eine Skriptdatei:
nano [script name]
2. Fügen Sie den folgenden Code ein:
#!/bin/bash
while true
do
echo "1. Update "
echo "2. Upgrade "
echo "3. Exit"
read Input
case "$Input" in
1) exec sudo apt update ;;
2) exec sudo apt upgrade ;;
3) break
esac
done
Das Skript macht Folgendes:
- Zeile 3 erzeugt ein unendliches
while
Schleife. - Zeilen 5-7 Drucken Sie die drei möglichen Optionen aus.
- Zeile 8 liest die Eingabe des Benutzers in die Variable
$Input
. - Zeile 9 startet ein
case
-Anweisung, die die Eingabe des Benutzers überprüft. - Zeilen 10-11 Führen Sie
apt update
aus oderapt upgrade
Befehl anstelle der aktuellen Shell. Wenn der Update- oder Upgrade-Vorgang endet, wird die Terminalsitzung beendet. - Zeile 12 verwendet den
break
-Anweisung zum Verlassen des unendlichenwhile
Schleife und beendet das Skript. Die Sitzung kehrt wie gewohnt zur aktuellen Shell zurück.
3. Speichern Sie das Skript und schließen Sie Nano.
4. Führen Sie das Bash-Skript in der aktuellen Umgebung aus, um die Ergebnisse anzuzeigen:
. [script name]
Das Ausführen des Skripts mit dem Quellbefehl wendet das Skriptverhalten auf die aktuelle Bash-Shell an. Verwenden Sie exec
um Bash-Skripte in anderen Programmen für einen sauberen Exit auszuführen.
Bash-Skripte protokollieren
Der exec
Der Befehl findet Verwendung bei der Manipulation von Dateideskriptoren für die Fehlerprotokollierung in Bash-Skripten. Die standardmäßigen Linux-Dateideskriptoren sind:
- stdin (0) - Standard in
- stdout (1) - Standardausgabe
- stderr (2) - Standardfehler
Verwenden Sie den exec
Befehl und leiten Sie die Dateideskriptoren in eine Datei um, um Protokolle zu erstellen. Führen Sie die folgenden Schritte aus, um zu sehen, wie die Protokollierung funktioniert:
1. Erstellen Sie ein Beispiel-Bash-Skript:
nano logging.sh
2. Fügen Sie den Code in die Datei ein:
#!/bin/bash
# Create test.log file
touch test.log
# Save test.log to log_file variable
log_file="test.log"
# Redirect stdin to $log_file
exec 1>>$log_file
# Redirect stderr to the same place as stdin
exec 2>&1
echo "This line is added to the log file"
echo "And any other lines after"
eho "This line has an error and is logged as stderr"
Das Skript leitet alle Befehlsausgaben und Fehler in dieselbe Datei um (test.log ).
3. Speichern Sie das Skript und schließen Sie den Texteditor.
4. Ändern Sie die Skriptberechtigung in ausführbar:
chmod +x logging.sh
5. Führen Sie das Skript aus:
./logging.sh
Das Skript gibt keinen Code aus. Stattdessen werden alle Ausgaben in test.log protokolliert Datei.
6. Verwenden Sie den cat-Befehl, um die test.log anzuzeigen Dateiinhalt:
cat test.log
Die Protokolldatei enthält alle Standardausgaben und Fehlermeldungen. Verwenden Sie exec
um Skripte zu debuggen und je nach Situation Eingaben, Ausgaben oder Fehler zu protokollieren.
Führen Sie Skripte in einer sauberen Umgebung aus
Die -c
Option für exec
Befehl schafft eine saubere Umgebung. Führen Sie zur Demonstration im Terminal Folgendes aus:
1. Starten Sie eine neue Bash-Shell-Sitzung:
bash
2. Verwenden Sie den printenv
Befehl zum Drucken aller Umgebungsvariablen in der aktuellen Bash-Shell:
printenv
Der Befehl gibt alle Umgebungsvariablen für die aktuelle Bash-Shell-Sitzung aus.
3. Führen Sie denselben Befehl mit exec
aus mit dem -c
Flagge:
exec -c printenv
Der Befehl printenv
läuft in einer sauberen Umgebung und es werden keine Variablen an die Konsole ausgegeben. Verwenden Sie den -c
Option zum Ausführen von Skripten oder Befehlen in sauberen Umgebungen.
exec mit find-Befehl
Der Find-Befehl in Linux hat den exec
Befehl als Option zum Ausführen einer Aktion für erkannten Inhalt. Die folgende Zeile führt beispielsweise chmod
aus Befehl auf find
Befehlsergebnisse:
sudo find ~ -name "test.log" -exec chmod +x '{}' \;
Der find
Befehl durchsucht das Home-Verzeichnis (~ ) für die test.log Datei und führt die Berechtigungsänderung aus.
Fazit
Nachdem Sie die Beispiele aus diesem Tutorial befolgt haben, sollten Sie wissen, wie Sie exec
verwenden Befehl effektiv in Bash-Skripten.
Als Nächstes erfahren Sie, wie Sie mit Crontab automatisch einen Job beim Neustart ausführen.