Bash (Unix-Shell)
Die Bash-Befehlssyntax ist eine Obermenge der Bourne-Shell-Befehlssyntax. Bash unterstützt seit bash 2.05a unter anderem die Erweiterung der Klammer, die Vervollständigung der Befehlszeile (programmierbare Vervollständigung), das grundlegende Debugging und die Signalverarbeitung (unter Verwendung von trap
). Bash kann die überwiegende Mehrheit der Bourne-Shell-Skripte ohne Änderung ausführen, mit Ausnahme von Bourne-Shell-Skripten, die in ein anderes Syntaxverhalten stolpern, das in Bash anders interpretiert wird, oder die versuchen, einen Systembefehl auszuführen, der mit einem neueren Bash-Builtin übereinstimmt usw. Die Bash-Befehlssyntax enthält Ideen aus der KornShell (ksh) und der C-Shell (csh), z. B. die Befehlszeilenbearbeitung, den Befehlsverlauf (history
Befehl), den Verzeichnisstapel, die Variablen $RANDOM
und $PPID
und die POSIX-Befehlsersetzungssyntax $(…)
.
Wenn ein Benutzer in einer interaktiven Befehlsshell die Tabulatortaste drückt, verwendet Bash seit Beta-Version 2.04 automatisch die Befehlszeilenvervollständigung, um teilweise eingegebene Programmnamen, Dateinamen und Variablennamen abzugleichen. Das Bash-Befehlszeilenvervollständigungssystem ist sehr flexibel und anpassbar und enthält häufig Funktionen, die Argumente und Dateinamen für bestimmte Programme und Aufgaben vervollständigen.
Die Syntax von Bash hat viele Erweiterungen, die in der Bourne-Shell fehlen. Bash kann ganzzahlige Berechnungen („arithmetische Auswertung“) durchführen, ohne externe Prozesse zu erzeugen. Zu diesem Zweck werden der Befehl ((…))
und die Variablensyntax $((…))
verwendet. Seine Syntax vereinfacht die E / A-Umleitung. Beispielsweise können Standardausgabe (stdout) und Standardfehler (stderr) gleichzeitig mit dem Operator &>
umgeleitet werden. Dies ist einfacher zu tippen als das Bourne-Shell-Äquivalent ‚command > file 2>&1
‚. Bash unterstützt die Prozessersetzung mit der Syntax <(command)
und >(command)
, die die Ausgabe (oder Eingabe) eines Befehls ersetzt, bei dem normalerweise ein Dateiname verwendet wird. (Dies wird über /proc /fd/ unnamed Pipes auf Systemen implementiert, die dies unterstützen, oder bei Bedarf über temporäre Named Pipes).
Wenn Sie das Schlüsselwort ‚function‘ verwenden, sind Bash-Funktionsdeklarationen nicht mit Bourne / Korn / POSIX-Skripten kompatibel (die KornShell hat das gleiche Problem, wenn Sie ‚function‘ verwenden), aber Bash akzeptiert die gleiche Funktionsdeklarationssyntax wie die Bourne- und Korn-Shells und ist POSIX-konform. Aufgrund dieser und anderer Unterschiede sind Bash-Shell-Skripte selten unter den Bourne- oder Korn-Shell-Interpretern ausführbar, es sei denn, sie wurden absichtlich unter Berücksichtigung dieser Kompatibilität geschrieben, was mit zunehmender Verbreitung von Linux immer seltener wird. Im POSIX-Modus entspricht Bash jedoch genauer POSIX.
Bash unterstützt hier Dokumente. Seit Version 2.05b kann Bash Standardeingaben (stdin) von einem „here string“ mit dem Operator <<<
umleiten.
Bash 3.0 unterstützt In-process regulary expression Matching mit einer Syntax, die an Perl erinnert.
Im Februar 2009 führte Bash 4.0 die Unterstützung für assoziative Arrays ein. Assoziative Array-Indizes sind Strings, ähnlich wie AWK oder Tcl. Sie können verwendet werden, um mehrdimensionale Arrays zu emulieren. Bash 4 wechselt auch seine Lizenz zu GPLv3; einige Benutzer vermuten, dass diese Lizenzänderung der Grund ist, warum macOS weiterhin ältere Versionen verwendet. Mit der Veröffentlichung von macOS Catalina im Jahr 2019 hat Apple die Verwendung von Bash in seinen Betriebssystemen endgültig eingestellt.
Brace expansionEdit
Brace Expansion, auch Alternation genannt, ist eine Funktion, die aus der C-Shell kopiert wurde. Es erzeugt eine Reihe von alternativen Kombinationen. Generierte Ergebnisse müssen nicht als Dateien vorhanden sein. Die Ergebnisse jeder erweiterten Zeichenfolge werden nicht sortiert und die Reihenfolge von links nach rechts bleibt erhalten:
$ echo a{p,c,d,b}eape ace ade abe$ echo {a,b,c}{d,e,f}ad ae af bd be bf cd ce cf
Benutzer sollten keine Klammererweiterungen in portablen Shell-Skripten verwenden, da die Bourne-Shell nicht dieselbe Ausgabe erzeugt.
$ # A traditional shell does not produce the same output$ /bin/sh -c 'echo a{p,c,d,b}e'a{p,c,d,b}e
Wenn die Klammererweiterung mit Platzhaltern kombiniert wird, werden zuerst die Klammern erweitert und dann die resultierenden Platzhalter normal ersetzt. Daher konnte eine Auflistung der JPEG- und PNG-Bilder im aktuellen Verzeichnis mit erhalten werden:
ls *.{jpg,jpeg,png} # expands to *.jpg *.jpeg *.png - after which, # the wildcards are processedecho *.{png,jp{e,}g} # echo just show the expansions - # and braces in braces are possible.
Zusätzlich zum Wechsel kann die Klammererweiterung für sequentielle Bereiche zwischen zwei Ganzzahlen oder Zeichen verwendet werden, die durch doppelte Punkte getrennt sind. Neuere Versionen von Bash erlauben eine dritte Ganzzahl, um das Inkrement anzugeben.
$ echo {1..10}1 2 3 4 5 6 7 8 9 10$ echo file{1..4}.txtfile1.txt file2.txt file3.txt file4.txt$ echo {a..e}a b c d e$ echo {1..10..3}1 4 7 10$ echo {a..j..3}a d g j
Wenn die Klammererweiterung mit der Variablenerweiterung kombiniert wird, wird die Variablenerweiterung nach der Klammererweiterung ausgeführt, was in einigen Fällen die Verwendung des integrierten eval
erforderlich machen kann:
$ start=1; end=10$ echo {$start..$end} # fails to expand due to the evaluation order{1..10}$ eval echo {$start..$end} # variable expansion occurs then resulting string is evaluated1 2 3 4 5 6 7 8 9 10
Startup scriptsEdit
Wenn Bash startet, führt es die Befehle in einer Vielzahl von Punktdateien aus. Im Gegensatz zu Bash-Shell-Skripten ist für Dot-Dateien normalerweise weder die Ausführungsberechtigung aktiviert noch eine Interpreter-Direktive wie #!/bin/bash
.
Legacy-kompatibles Bash startup exampleEdit
Das Skelett ~/.bash_profile
unten ist kompatibel mit der Bourne-Shell und gibt Semantik ähnlich wie csh für die ~/.bashrc
und ~/.bash_login
. Die && cmd
ist eine Kurzschlussauswertung, die prüft, ob der Dateiname existiert und lesbar ist, und den Teil nach der &&
überspringt, wenn dies nicht der Fall ist.
&& . ~/.profile # set up environment, once, Bourne-sh syntax onlyif ; then # are we interactive? && . ~/.bashrc # tty/prompt/function setup for interactive shells && . ~/.bash_login # any at-login tasks for login shell onlyfi # End of "if" block
Betriebssystemprobleme in Bash startupEdit
Einige Versionen von Unix und Linux enthalten Bash-Systemstartskripte, im Allgemeinen unter den /etc
Verzeichnissen. Bash ruft diese als Teil seiner Standardinitialisierung auf, aber andere Startdateien können sie in einer anderen Reihenfolge als die dokumentierte Bash-Startsequenz lesen. Der Standardinhalt der Dateien des Root-Benutzers kann ebenfalls Probleme aufweisen, ebenso wie die Skelettdateien, die das System beim Einrichten neuen Benutzerkonten zur Verfügung stellt. Die Startskripte, die das X Window System starten, können auch überraschende Dinge mit den Bash-Startskripten des Benutzers tun, um Benutzerumgebungsvariablen einzurichten, bevor der Fenstermanager gestartet wird. Diese Probleme können häufig mit einer ~/.xsession
oder ~/.xprofile
—Datei zum Lesen der ~/.profile
-Datei behoben werden, die die Umgebungsvariablen bereitstellt, die Bash-Shell-Fenster aus dem Fenstermanager benötigen, z. B. xterm oder Gnome Terminal.
PortabilityEdit
Wenn Sie Bash mit der Option --posix
aufrufen oder set -o posix
in einem Skript angeben, entspricht Bash sehr genau dem POSIX 1003.2-Standard. Bash-Shell-Skripte, die für die Portabilität vorgesehen sind, sollten mindestens den POSIX-Shell-Standard berücksichtigen. Einige Bash-Funktionen, die in POSIX nicht gefunden werden, sind:
- Bestimmte erweiterte Aufrufoptionen
- Klammererweiterung
- Arrays und assoziative Arrays
- Die doppelte Klammer
]
erweitertes Testkonstrukt und seine Regex-Übereinstimmung - Das arithmetische Bewertungskonstrukt mit doppelten Klammern (nur
(( ... ))
;$(( ... ))
ist POSIX) - Bestimmte string-manipulation operationen in parameter expansion
-
lokale
für scoped variablen - Prozess substitution
- Bash-spezifische builtins
- Coprocesses
- $EPOCHSECONDS und $EPOCHREALTIME variablen
Wenn ein Code eine solche Funktion verwendet, wird dies als „Bashismus“ bezeichnet – ein Problem für die tragbare Verwendung. Debians checkbashcheck
und Vidar Holens shellcheck
können verwendet werden, um sicherzustellen, dass ein Skript diese Teile nicht enthält. Die Liste variiert je nach tatsächlicher Ziel-Shell: Debians Richtlinie erlaubt einige Erweiterungen in ihren Skripten (wie sie in dash
enthalten sind), während ein Skript, das Bourne-Shells vor POSIX unterstützen soll, wie autoconfs configure
, in den Funktionen, die sie verwenden können, noch eingeschränkter ist.
Tastaturkürzelbearbeiten
Bash verwendet readline, um Tastaturkürzel für die Befehlszeilenbearbeitung unter Verwendung der Standardtastenbindungen (Emacs) bereitzustellen. Vi-Bindungen können durch Ausführen von set -o vi
aktiviert werden.
Process managementEdit
Die Bash-Shell verfügt über zwei Ausführungsmodi für Befehle: Batch- und Concurrent-Modus.
Um Befehle im Batch (d. h. nacheinander) auszuführen, müssen sie durch das Zeichen „;“ oder in separaten Zeilen getrennt sein:
command1; command2
In diesem Beispiel wird command1 ausgeführt, wenn command2 beendet ist.
Eine Hintergrundausführung von command1 kann mit (symbol &) am Ende eines Ausführungsbefehls erfolgen, und der Prozess wird im Hintergrund ausgeführt, wobei sofort die Kontrolle an die Shell zurückgegeben wird und die weitere Ausführung von Befehlen ermöglicht wird.
command1 &
Oder um zwei command1 und command2 gleichzeitig auszuführen, müssen sie in der Bash-Shell wie folgt ausgeführt werden:
command1 & command2
In diesem Fall wird command1 im Hintergrund ausgeführt & Symbol und gibt sofort die Kontrolle an die Shell zurück, die command2 im Vordergrund ausführt.
Ein Prozess kann gestoppt und die Steuerung an bash zurückgegeben werden, indem Sie Strg+z eingeben, während der Prozess im Vordergrund ausgeführt wird.
Eine Liste aller Prozesse, sowohl im Hintergrund als auch gestoppt, kann durch Ausführen von jobs
erreicht werden:
$ jobs- Running command1 &+ Stopped command2
In der Ausgabe bezieht sich die Zahl in Klammern auf die Job-ID. Das Pluszeichen kennzeichnet den Standardprozess für bg
und fg
. Der Text „Running“ und „Stopped“ beziehen sich auf den Prozessstatus. Die letzte Zeichenfolge ist der Befehl, der den Prozess gestartet hat.
Der Status eines Prozesses kann mit verschiedenen Befehlen geändert werden. Der Befehl fg
bringt einen Prozess in den Vordergrund, während bg
einen angehaltenen Prozess in den Hintergrund setzt. bg
und fg
können eine Job-ID als erstes Argument verwenden, um den Prozess anzugeben, auf den reagiert werden soll. Ohne einen verwenden sie den Standardprozess, der durch ein Pluszeichen in der Ausgabe von jobs
. Mit dem Befehl kill
kann ein Prozess vorzeitig beendet werden, indem ein Signal gesendet wird. Die Job-ID muss nach einem Prozentzeichen angegeben werden:
kill %1
Conditional executionEdit
Bash liefert Befehlstrennzeichen für „bedingte Ausführung“, die die Ausführung eines Befehls vom Exit-Code abhängig machen, der durch einen Präzedenzfallbefehl festgelegt wurde. Zum Beispiel:
cd "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2
Wo ./do_something wird nur ausgeführt, wenn der Befehl cd (Verzeichnis ändern) „erfolgreich“ war (einen Exit-Status von Null zurückgegeben hat) und der Befehl echo nur ausgeführt wird, wenn entweder die cd oder die ./ do_something Befehl gibt einen „Fehler“ zurück (Exit-Status ungleich Null).
Für alle Befehle wird der Exit-Status in der speziellen Variablen $?
gespeichert. Bash unterstützt auch if ...;dann ...;anderes ...;fi
und Fall $VARIABLE in $pattern)...;;$other_pattern)...;; esac
Formen der bedingten Befehlsauswertung.
Bugreportingedit
Ein externer Befehl namens bashbug meldet Bash-Shell-Fehler. Wenn der Befehl aufgerufen wird, wird der Standardeditor des Benutzers mit einem Formular zum Ausfüllen aufgerufen. Das Formular wird an die Bash-Betreuer (oder optional an andere E-Mail-Adressen) gesendet.
Programmable completionEdit
Bash programmierbare Vervollständigung, complete
und compgen
Befehle sind seit der Beta-Version von 2 verfügbar.04 im Jahr 2000. Diese Einrichtungen ermöglichen eine komplexe intelligente Vervollständigung, z. B. das Angebot, verfügbare Programmoptionen automatisch zu vervollständigen, und dann, nachdem der Benutzer eine Option ausgewählt hat, für die ein Dateiname als nächste Eingabe erforderlich ist, nur Dateipfade automatisch zu vervollständigen (und keine anderen Optionen) für das nächste Token.
Leave a Reply