Bash (Unix-Shell) - Bash (Unix shell)

Bash
Gnu-bash-logo.svg
Bash screenshot.png
Screenshot einer Bash-Sitzung
Originalautor(en) Brian Fox
Erstveröffentlichung 8. Juni 1989 ; Vor 32 Jahren ( 1989-06-08 )
Stabile Version
5.1  Bearbeiten Sie dies auf Wikidata / 6. Dezember 2020 ; vor 10 Monaten ( 6. Dezember 2020 )
Vorschauversion
5.1.8  Bearbeiten Sie dies auf Wikidata / 4. Mai 2021 ; vor 5 Monaten ( 4 Mai 2021 )
Repository
Geschrieben in C
Betriebssystem
Plattform GNU
Verfügbar in Mehrsprachig ( gettext )
Typ Unix-Shell , Befehlssprache
Lizenz Ab 4.0: GPL-3.0 oder höher
1.11? bis 3.2: GPL-2.0 oder höher
0.99? bis 1.05?: GPL-1.0 oder höher
Webseite www .gnu .org / Software / bash /

Bash ist eine Unix-Shell und eine Befehlssprache, die von Brian Fox für das GNU-Projekt als Ersatz für freie Software für die Bourne-Shell geschrieben wurde . Es wurde erstmals 1989 veröffentlicht und wurde als Standard- Login- Shell für die meisten Linux- Distributionen verwendet. Eine Version ist auch für Windows 10 über das Windows-Subsystem für Linux verfügbar . Es ist auch die Standard-Benutzer-Shell in Solaris 11. Bash war auch die Standard-Shell in allen Versionen von Apple macOS vor der Veröffentlichung von macOS Catalina 2019 , die die Standard-Shell in zsh geändert hat , obwohl Bash derzeit als alternative Shell verfügbar bleibt.

Bash ist ein Befehlsprozessor , der normalerweise in einem Textfenster ausgeführt wird, in dem der Benutzer Befehle eingibt, die Aktionen auslösen. Bash kann auch Befehle aus einer Datei lesen und ausführen, die als Shell-Skript bezeichnet wird . Wie die meisten Unix - Shells, es unterstützt Dateinamen Globbing (Wildcard - Matching), Rohrleitungen , hier Dokumente , Kommandosubstitution , Variablen und Kontrollstrukturen für die zustands Testen und Iteration . Die Schlüsselwörter , Syntax , Variablen mit dynamischem Gültigkeitsbereich und andere grundlegende Funktionen der Sprache werden alle aus sh kopiert . Andere Funktionen, zB History , werden von csh und ksh kopiert . Bash ist eine POSIX- kompatible Shell, jedoch mit einer Reihe von Erweiterungen.

Der Name der Muschel ist ein Akronym für Bourne Again Shell , ein Wortspiel mit dem Namen der Bourne-Shell , die sie ersetzt, und der Vorstellung, " wiedergeboren " zu werden.

Eine Sicherheitslücke in Bash aus Version 1.03 (August 1989), genannt Shellshock , wurde Anfang September 2014 entdeckt und führte schnell zu einer Reihe von Angriffen im Internet . Patches zur Behebung der Fehler wurden kurz nach der Identifizierung der Fehler bereitgestellt.

Geschichte

Brian Fox begann Codierung Bash am 10. Januar 1988, nach Richard Stallman mit dem Mangel an Fortschritten unzufrieden wurde durch einen früheren Entwickler gemacht. Stallman und die Free Software Foundation (FSF) betrachteten eine freie Shell, die existierende Shell-Skripte ausführen könnte, die so strategisch für ein völlig freies System, das aus BSD- und GNU-Code erstellt wurde, war, dass dies eines der wenigen Projekte war, die sie selbst finanzierten, wobei Fox die Arbeit übernahm ein Mitarbeiter der FSF. Fox veröffentlichte Bash als Beta, Version .99, am 8. Juni 1989 und blieb der primäre Betreuer bis irgendwann zwischen Mitte 1992 und Mitte 1994, als er von der FSF entlassen wurde und seine Verantwortung auf einen anderen frühen Mitarbeiter übertragen wurde. Chet Ramey.

Seitdem ist Bash die bei Linux-Benutzern bei weitem beliebteste Shell und die interaktive Standard-Shell auf den verschiedenen Distributionen dieses Betriebssystems (obwohl die Almquist-Shell möglicherweise die Standard-Skript-Shell ist) und auf Apples macOS-Releases vor Catalina im Oktober 2019. Bash wurde auch auf Microsoft Windows portiert und mit Cygwin und MinGW verteilt , auf DOS durch das DJGPP- Projekt, auf Novell NetWare , auf OpenVMS durch das GNV-Projekt, auf ArcaOS und über verschiedene Terminalemulationsanwendungen auf Android .

Im September 2014 entdeckte Stéphane Chazelas, ein Unix/Linux-Spezialist, einen Sicherheitsfehler im Programm. Der Fehler, zuerst am 24. September offenbart ist , wurde genannt Shellshock und die Nummern zugewiesen CVE - 2014 bis 6271 , CVE 2.014-6.277 und CVE - 2014-7169 . Der Fehler wurde als schwerwiegend angesehen, da CGI- Skripte, die Bash verwenden, angreifbar sein könnten und die Ausführung willkürlichen Codes ermöglichen . Der Fehler hing damit zusammen, wie Bash Funktionsdefinitionen über Umgebungsvariablen an Subshells übergibt .

Merkmale

Die Bash- Befehlssyntax ist eine Obermenge der Bourne-Shell-Befehlssyntax. Bash unterstützt unter anderem die Erweiterung von Klammern , die Befehlszeilenvervollständigung (Programmable Completion), grundlegendes Debugging und die Signalverarbeitung (mit trap) seit bash 2.05a. Bash kann die überwiegende Mehrheit der Bourne-Shell-Skripte ohne Modifikation ausführen, mit Ausnahme von Bourne-Shell-Skripten, die auf ein in Bash unterschiedlich interpretiertes Randsyntax-Verhalten stolpern oder versuchen, einen Systembefehl auszuführen, der einem neueren Bash-Building entspricht usw. Die Bash-Befehlssyntax enthält gezeichnete Ideen von der Kornshell (kSH) und der C - Shell (CSH) , wie beispielsweise Befehlszeileneditor, Befehlsverlauf ( historyBefehl), das Verzeichnis Stapel, die $RANDOMund $PPIDVariablen und POSIX Befehlssubstitutions Syntax $(…).

Wenn ein Benutzer die Tabulatortaste innerhalb einer interaktiven Befehlsshell drückt , verwendet Bash seit der Betaversion 2.04 automatisch die Befehlszeilenvervollständigung , um teilweise eingegebene Programmnamen, Dateinamen und Variablennamen abzugleichen. Das Bash-Kommandozeilenvervollständigungssystem ist sehr flexibel und anpassbar und wird oft mit Funktionen gepackt, die Argumente und Dateinamen für bestimmte Programme und Aufgaben vervollständigen.

Die Syntax von Bash weist viele Erweiterungen auf, die in der Bourne-Shell fehlen. Bash kann ganzzahlige Berechnungen ("arithmetische Auswertung") durchführen, ohne externe Prozesse hervorzubringen. Es verwendet dazu den ((…))Befehl und die $((…))Variablensyntax. Seine Syntax vereinfacht die E/A-Umleitung . Zum Beispiel kann es mit dem Operator Standardausgabe (stdout) und Standardfehler (stderr) gleichzeitig umleiten &>. Dies ist einfacher zu tippen als das Bourne-Shell-Äquivalent ' command > file 2>&1'. Bash unterstützt die Prozesssubstitution mit der <(command)und >(command)-Syntax, 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 über temporäre Named Pipes, falls erforderlich).

Wenn das Schlüsselwort 'function' verwendet wird, sind Bash-Funktionsdeklarationen nicht mit Bourne/Korn/POSIX-Skripten kompatibel (die KornShell hat das gleiche Problem bei der Verwendung von 'function'), aber Bash akzeptiert dieselbe 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 lauffähig, es sei denn, sie wurden bewusst unter Berücksichtigung dieser Kompatibilität geschrieben, die mit zunehmender Verbreitung von Linux immer seltener wird. Aber im POSIX-Modus orientiert sich Bash stärker an POSIX.

Bash unterstützt hier Dokumente . Seit Version 2.05b kann die Bash Standardeingaben (stdin) von einem "here string" mit dem <<<Operator umleiten .

Bash 3.0 unterstützt den prozessinternen Abgleich mit regulären Ausdrücken 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 bei AWK oder Tcl . Sie können verwendet werden, um mehrdimensionale Arrays zu emulieren. Bash 4 stellt auch seine Lizenz auf GPL-3.0 oder höher um ; Einige Benutzer vermuten, dass diese Lizenzänderung der Grund dafür ist, dass MacOS weiterhin ältere Versionen verwendet. Apple hat mit der Veröffentlichung von MacOS Catalina im Jahr 2019 endgültig aufgehört, Bash in seinen Betriebssystemen zu verwenden.

Strebenerweiterung

Die Klammererweiterung, 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 vorliegen. Die Ergebnisse jeder erweiterten Zeichenfolge werden nicht sortiert und die Reihenfolge von links nach rechts wird beibehalten:

$ echo a{p,c,d,b}e
ape ace ade abe
$ echo {a,b,c}{d,e,f}
ad ae af bd be bf cd ce cf

Benutzer sollten in portablen Shell-Skripten keine geschweiften Erweiterungen 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 Erweiterung von geschweiften Klammern mit Platzhaltern kombiniert wird, werden zuerst die geschweiften Klammern erweitert und dann werden die resultierenden Platzhalter normal ersetzt. Daher kann eine Auflistung von JPEG- und PNG-Bildern im aktuellen Verzeichnis abgerufen werden mit:

ls *.{jpg,jpeg,png}    # expands to *.jpg *.jpeg *.png - after which,
                       # the wildcards are processed
echo *.{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 ganzen Zahlen oder durch Doppelpunkte getrennte Zeichen verwendet werden. Neuere Versionen von Bash erlauben eine dritte ganze Zahl, um das Inkrement anzugeben.

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
$ echo file{1..4}.txt
file1.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 Korsettexpansion mit der variablen Expansion kombiniert wird, wird die variable Expansion nach der Korsettexpansion durchgeführt, was in einigen Fällen die Verwendung des evaleingebauten Systems erforderlich machen kann , also:

$ 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 evaluated
1 2 3 4 5 6 7 8 9 10

Startskripte

Wenn Bash startet, führt es die Befehle in einer Vielzahl von Punktdateien aus . Im Gegensatz zu Bash-Shell-Skripten haben Punktdateien in der Regel weder die Ausführungsberechtigung aktiviert noch eine Interpreter-Direktive wie #!/bin/bash.

Legacy-kompatibles Bash-Startbeispiel

Das folgende Skelett ~/.bash_profileist mit der Bourne-Shell kompatibel und bietet eine Semantik ähnlich der von csh für das ~/.bashrcund ~/.bash_login. Das ist eine Kurzschlussauswertung , die testet, ob der Dateiname vorhanden und lesbar ist, wobei der Teil nach dem übersprungen wird, wenn er nicht vorhanden ist. [ -r filename ] && cmd&&

[ -r ~/.profile ] && . ~/.profile             # set up environment, once, Bourne-sh syntax only
if [ -n "$PS1" ] ; then                       # are we interactive?
   [ -r ~/.bashrc     ] && . ~/.bashrc        # tty/prompt/function setup for interactive shells
   [ -r ~/.bash_login ] && . ~/.bash_login    # any at-login tasks for login shell only
fi                                            # End of "if" block

Betriebssystemprobleme beim Bash-Start

Einige Versionen von Unix und Linux enthalten Bash-Systemstartskripte, im Allgemeinen in den /etcVerzeichnissen. Bash ruft diese als Teil ihrer Standardinitialisierung auf, aber andere Startdateien können sie in einer anderen Reihenfolge lesen als die dokumentierte Bash-Startsequenz. Der Standardinhalt der Dateien des Root-Benutzers kann ebenfalls Probleme haben, ebenso wie die Skelettdateien, die das System beim Setup für neue Benutzerkonten bereitstellt. Die Startup-Skripte, die das X-Window-System starten , können auch überraschende Dinge mit den Bash-Startskripten des Benutzers tun, um zu versuchen, Benutzerumgebungsvariablen einzurichten, bevor der Window-Manager gestartet wird . Diese Probleme können oft mit einer ~/.xsessionoder ~/.xprofile-Datei behoben werden, um die zu lesen ~/.profile– die die Umgebungsvariablen bereitstellt, die Bash-Shell-Fenster, die vom Fenstermanager erzeugt werden, benötigen, wie z. B. xterm oder Gnome Terminal .

Portabilität

Der Aufruf von Bash mit der --posixOption oder der Angabe set -o posixin einem Skript führt dazu, dass Bash sehr eng mit dem POSIX 1003.2-Standard übereinstimmt . Für Portabilität vorgesehene Bash-Shell-Skripte sollten mindestens den POSIX-Shell-Standard berücksichtigen. Einige Bash-Funktionen, die in POSIX nicht zu finden sind, sind:

  • Bestimmte erweiterte Aufrufoptionen
  • Strebenerweiterung
  • Arrays und assoziative Arrays
  • Das Double-Bracket- [[ ... ]]Extended-Test-Konstrukt und sein Regex-Matching
  • Das Konstrukt zur arithmetischen Auswertung mit doppelten Klammern (nur (( ... )); $(( ... ))ist POSIX)
  • Bestimmte String-Manipulationsoperationen bei der Parametererweiterung
  • local für bereichsbezogene Variablen
  • Prozesssubstitution
  • Bash-spezifische Built-Ins
  • Koprozesse
  • Variablen $EPOCHSECONDS und $EPOCHREALTIME

Verwendet ein Codestück ein solches Feature, spricht man von einem „Bashismus“ – ein Problem für den portablen Einsatz. Die von Debian checkbashismsund Vidar Holen shellcheckkönnen verwendet werden, um sicherzustellen, dass ein Skript diese Teile nicht enthält. Die Liste hängt von der tatsächlichen Ziel Shell abhängig: Debian Politik einige Erweiterungen in ihre Skripte können (wie sie in der sind dash Shell), während ein Skript zur Unterstützung Pre-POSIX - Shells Bourne zu wollen, wie autoconf ‚s configuresind noch begrenzt in welche Funktionen sie nutzen können.

Tastatürkürzel

Bash verwendet readline, um Tastaturkürzel für die Befehlszeilenbearbeitung mit den standardmäßigen ( Emacs ) Tastenkombinationen bereitzustellen. Vi-Bindungen können durch Ausführen von aktiviert werden set -o vi.

Prozessmanagement

Die Bash-Shell verfügt über zwei Ausführungsmodi für Befehle: Batch und gleichzeitiger Modus.

Um Befehle im Stapel (dh nacheinander) auszuführen, müssen sie durch das Zeichen ";" oder in separaten Zeilen getrennt werden:

command1; command2

in diesem Beispiel wird command2 ausgeführt, wenn command1 beendet ist.

Eine Hintergrundausführung von Befehl1 kann mit (Symbol &) am Ende eines Ausführungsbefehls erfolgen, und der Prozess wird im Hintergrund ausgeführt und gibt sofort die Kontrolle an die Shell zurück und ermöglicht die weitere Ausführung von Befehlen.

command1 &

Oder um eine gleichzeitige Ausführung von zwei Befehlen 1 und 2 zu haben, müssen sie in der Bash-Shell wie folgt ausgeführt werden:

command1 & command2

In diesem Fall wird Befehl1 im Hintergrund & Symbol ausgeführt, wodurch sofort die Kontrolle an die Shell zurückgegeben wird, die Befehl2 im Vordergrund ausführt.

Ein Prozess kann gestoppt und die Kontrolle an die bash zurückgegeben werden, indem man Ctrl+ eingibt, zwährend der Prozess im Vordergrund läuft.

Eine Liste aller Prozesse, sowohl im Hintergrund als auch gestoppt, erhalten Sie durch Ausführen von jobs:

$ jobs
[1]-  Running                  command1 &
[2]+  Stopped                  command2

In der Ausgabe bezieht sich die Zahl in Klammern auf die Job-ID. Das Pluszeichen kennzeichnet den Standardprozess für bgund fg. Die Texte "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 fgBefehl bringt einen Prozess in den Vordergrund, während bgein gestoppter Prozess im Hintergrund ausgeführt wird. bgund fgkann 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 gekennzeichnet ist jobs. Der killBefehl kann verwendet werden, um einen Prozess vorzeitig zu beenden, indem man ihm ein Signal sendet . Die Job-ID muss nach einem Prozentzeichen angegeben werden:

kill %1

Bedingte Ausführung

Bash stellt Befehlstrennzeichen für "bedingte Ausführung" bereit, die die Ausführung eines Befehls vom Exit-Code abhängig machen, der durch einen vorhergehenden Befehl festgelegt wurde. Zum Beispiel:

cd "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2

Wo ./do_something wird nur ausgeführt , wenn die CD war (Verzeichnis wechseln) Befehl „erfolgreich“ und der (ein Exit - Status von Null zurück) echo würde nur dann ausgeführt Befehl entweder , wenn die CD oder der ./do_something Befehl gibt einen „Fehler“ (Ausstiegsstatus ungleich Null).

Für alle Befehle wird der Exit-Status in der speziellen Variablen gespeichert $?. Bash unterstützt und formt auch die bedingte Befehlsauswertung. if ...;then ...;else ...;ficase $VARIABLE in $pattern)...;;$other_pattern)...;; esac

Fehlerberichte

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.

Programmierbare Vervollständigung

Bash-programmierbare Vervollständigung completeund compgenBefehle sind seit der Beta-Version von 2.04 im Jahr 2000 verfügbar. Diese Funktionen ermöglichen eine komplexe intelligente Vervollständigung, z nächste Eingabe, nur automatisch vervollständigende Dateipfade (und keine anderen Optionen) für das nächste Token.

Veröffentlichungsverlauf

Ausführung Veröffentlichungsdatum Versionshinweise
bash-5.1 2020-12-07 Github-Versionsgeschichte NEWS
bash-5.0 2019-01-07
bash-5.0-rc1 2018-12-20
bash-5.0-beta2 2018-11-28
bash-5.0-beta 2018-09-17
bash-5.0-alpha 2018-05-22
bash-4.4 2016-09-15 Github-Versionsgeschichte NEWS v4.4
bash-4.4-rc2 2016-08-22
bash-4.4-rc1 2016-02-24
bash-4.4-beta2 2016-07-11
bash-4.4-beta 2015-10-12
bash-4,3 2014-02-26
bash-4.2 2011-02-13
bash-4.1 2009-12-31
bash-4.0 2009-02-20
bash-4.0-rc1 2009-01-12
bash-3.2 2006-10-11
bash-3.1 2005-12-08
bash-3.0 2004-08-03
bash-2.05b 2002-07-17
bash-2.05a 2001-11-16
bash-2.05 2001-04-09
bash-2.04 2000-03-21
bash-2.03 1999-02-19
bash-2.02 1998-04-18
bash-2.01 1997-06-05
Schlag-2.0 1996-12-31

Siehe auch

Verweise

Externe Links