So führen Sie Befehle aus einem Shell-Skript aus

How Execute Commands From Within Shell Script

In bash kann die Ausführung von Befehlen aus einem Shell-Skript zunächst etwas einschüchternd wirken und einen Vertrauensvorschuss erfordern. Schließlich sind Befehle, die innerhalb eines Bash-Skripts ausgeführt werden, nicht interaktiv. Hier legen wir die Grundlage für die Ausführung von Befehlen innerhalb eines Shell-Skripts und beantworten die folgenden Fragen zu Befehlen: Woher kommen sie? Was sind Sie? Wie verwenden wir sie in einem Skript?

Woher kommen Befehle?

Befehle in bash stammen aus einer der folgenden Kategorien:



Bash selbst (siehe Builtins)

Bash verfügt über einen eigenen Befehlssatz, der den Zugriff auf die integrierten Funktionen wie das Deklarieren von Arrays, das Lesen von Zeilen aus einer Datei und andere in die Bash integrierte Funktionen ermöglicht. Befehle dieser Kategorie nennen wir bash builtin-Befehle oder kurz Builtins.



Ausführbare Dateien in Ihrer Umgebung (siehe externe Befehle)

Standardmäßig erbt die bash standardmäßig bestimmte Variablen. Dies wird im Fall der PATH-Variablen beobachtet, die Speicherorte für ausführbare Dateien enthält, auf die in der Bash als externe Befehle verwiesen wird. Das heißt, wenn die Locken Wenn sich der Befehl in Ihrem Pfad befindet, kann er innerhalb eines Bash-Skripts genauso wie im interaktiven Modus ausgeführt werden. Befehle dieser Kategorie nennen wir externe Befehle oder kurz Befehle.



Benutzerdefinierte Funktion (siehe Funktionen)

Vor dem Ausführen externer Befehle und Built-Ins prüft die bash, ob eine Funktion definiert ist. Ist dies der Fall, wird die Funktion als Befehl ausgeführt. Wenn dies nicht der Fall ist, wird die Rangfolge der Befehle nach unten verschoben. Um außerhalb eines Skripts definierte Funktionen auszuführen, müssen sie mit dem Attribut -x deklariert werden; andernfalls können sie mit der . Befehl. Befehle dieser Kategorie nennen wir benutzerdefinierte Funktionen oder kurz Funktionen.

Was sind Befehle

Ein Befehl ist ein beliebiges Wort, das als einzelner Einstiegspunkt eines Programms innerhalb der Shell-Umgebung behandelt wird. Wird der Befehl ausgeführt, werden der Befehl selbst und optionale Argumente als Positionsparameter übergeben, ${0}, ${1}, ${2}, … Der nullte Positionsparameter (${0}) bezeichnet den Befehl selbst und bleibt im Kontext unverändert. Das heißt, im Gegensatz zu Positionsparametern in Funktionen, ${1}, ${2}, …, die sich je nach Kontext ändern können, bleibt ${0} zwischen Funktionsaufrufen unverändert.

Befehle sind abhängig vom Speicherort der Deklaration und den Attributen, die Ihrem Bash-Programm als global, in bash integriert oder lokal zugewiesen sind.



Hier ist eine Liste von Befehlstypen, die Sie kennen sollten.

Eingebaute Befehle

Dies sind erstklassige Bürger des bash-Universums, einschließlich Zeichen wie '.' ':' '[' ']' und reservierten Wörtern wie deklarieren in bash . Sie verlassen sich darauf, dass diese Befehle, die in der Liste der integrierten Bash-Befehle enthalten sind, in Ihrem Bash-Skript zur Verfügung stehen.

Abhängig von der Bezeichnung und Versionsnummer Ihres Bash-Interpreters sind einige Befehle möglicherweise nicht verfügbar.

Externe Befehle

Externe Befehle sind ausführbare Dateien, auf die außerhalb eines Bash-Skripts wie curl zugegriffen werden kann. Im Gegensatz zu Funktionen werden externe Befehle nicht als Variablen gespeichert.

Je niedriger die Priorität eines Befehlstyps ist, desto später kann der Befehl interpretiert werden. Externe Befehle haben die niedrigste Rangfolge in der bash. Das heißt, bevor ein externer Befehl ausgeführt wird, sucht die Interpreter-Bash nach Funktionen, dann nach Builtins und versucht schließlich zu sehen, ob ein Befehl extern existiert. Wenn nicht, sollten Sie den folgenden Fehler sehen.

bash: unbekannt-Befehl:Befehlnicht gefunden

In einem Bash-Skript können Funktionen das Verhalten externer Befehle überschreiben, wenn sie denselben Namen verwenden, wie wir es zuvor in curl-Bash-Beispielen gesehen haben. Es folgt ein Beispiel für einen benutzerdefinierten externen Befehl, der eine Funktion verwendet.

Locken() {
Befehl ${FUNCNAME}...
}

Dies funktioniert, weil Funktionen eine höhere Priorität haben als externe Befehle und sogar Bash-Integrationen. Die Einschränkung sind die zulässigen Zeichen in einem Funktionsnamen.

Beachten Sie, dass das obige Beispiel unter Verwendung eines Alias ​​wie folgt ausgeführt werden kann.

alias Locken= ’
{
locken...
}
'

Bei Aliasen kann sich der Befehlstyp je nach Ausführungskontext unterscheiden, während bei benutzerdefinierten externen Befehlen, die die Funktionsmethode verwenden, der Einstiegspunkt immer eine Funktion ist.

Funktionen

Funktionsregel in der bash. Bevor Sie sich Builtins und externe Befehle ansehen, prüft die bash, ob eine Funktion durch einen Kandidatenfunktionsnamen, das erste Wort in einer Zeile oder nach dem ; Zeichen, das das Ende einer Befehlszeile bezeichnet. Die einzige Ausnahme sind in Großbuchstaben geschriebene Bash-Variablen wie ${FUNCNAME}.

alias() { FUNKNAME=asdf ;rauswerfen $ {@ ,,};}
alias Locken='TEST CURL-ALIAS' #?

Einfache Befehle

Einfache Befehle sind in den Bash-Manpages als Wort definiert, gefolgt von optionalen Argumenten. Im Kontext kann ein einfacher Befehl entweder ein eingebauter, externer Befehl oder eine Funktion sein.

So führen Sie Befehle aus einem Bash-Skript aus

Da wir nun wissen, welche Arten von Befehlen verfügbar sind, können wir ihre Verwendung in Ihren Skripten erweitern. Zuerst müssen wir wissen, wie die Befehlspriorität in der bash funktioniert.

Hier sind einige Möglichkeiten, die Rangfolge in einem Bash-Skript zu steuern.

Lass Bash entscheiden

Befehlsname

Meistens, insbesondere am Anfang, lassen wir bash einfach entscheiden, welchen Befehl wir verwenden. Es gibt jedoch Fälle, in denen Ihre Absicht von bash möglicherweise nicht richtig interpretiert wird. Dies ist der Fall, wenn sich Funktionsnamen und externe Befehle oder Builtins überschneiden.

Führen Sie einen externen Befehl aus

BefehlBefehlsname

Angenommen, es gibt einen externen Befehl command_name, der im interaktiven Modus verfügbar ist, und Sie möchten ihn in einem Bash-Skript verwenden. Wir können bash explizit mitteilen, dass command_name ein externer Befehl ist, indem wir den Befehl builtin verwenden.

Beispiele für externe Befehle

Beispiele für externe Befehle unter der Annahme, dass Folgendes installiert ist:

Datei
gehen
figlet
Beispiel: Dateityp und Informationen abrufen
{ # Dateityp und Informationen abrufen
Datei ${infile} # (1,2)
}
# (1) Befehl, Datei
# (2) infile={Pfad zur Datei}
Beispiel: Stage modifiziert und neue Dateien in git
{ # Bühnendateien in git
git hinzufügen.# (1)
}
# (1) Befehl, git
Beispiel: Erstellen Sie ASCII-Kunst mit Figlet
{ # ASCII-Kunst erstellen
figlet${Nachricht} # (1,2)
}
# (1) Befehl, Feigling
# (2) message={Nachricht zur Anzeige als ASCII-Grafik}

Führen Sie einen eingebauten Befehl aus

eingebautBefehlsname

Angenommen, command_name ist einer der Befehle, die als eingebaut in der Bash definiert sind. Um der Bash mitzuteilen, dass wir command_name als Builtin ausführen möchten, verwenden wir das eingebaute Builtin.

Beispiele für integrierte Befehle
Beispiel: Wie viele eingebaute?
eingebaut{,}{,,}{,,,} # wie viele eingebaute?
Beispiel: Phantom-Deklaration
{
erklären() { rauswerfenHoppla!;}
erklären–xferklären #?
}

Abschluss

Es ist ziemlich einfach, einen Befehl innerhalb eines Bash-Shell-Skripts auszuführen. Es gibt drei Hauptbefehlstypen. Zu wissen, wie einfache Befehle in der Bash interpretiert werden, kann zu einer besseren Kontrolle darüber führen, welcher Befehlstyp in der Laufzeit ausgeführt wird.