ubuntuusers.de

Hinweis: Dies ist ein statischer Snapshot unseres Wikis vom 25. März 2013 und kann daher nicht bearbeitet werden. Der aktuelle Artikel ist unter wiki.ubuntuusers.de zu finden.
WikiBash

Bash

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

Die Bash ist so etwas wie die Standard-Shell [2] unter Linux. Dabei steht Bash für Bourne again Shell.

Erweiterte Einstellungsmöglichkeiten werden im Artikel Bash/bashrc erklärt.

Grundlagen

Eine grundlegende Übersicht findet man im Artikel Shell. Im weiteren werden einige Funktionen beschrieben, die Bash-spezifisch sind, sich aber durchaus auch in anderen Shell-Umgebungen wiederfinden können.

History

In der Bash ist es möglich, die zuletzt eingegebenen Befehle mit den Pfeiltasten ( / ) durchzublättern oder zu durchsuchen. Dies vereinfacht die Bedienung in der Praxis enorm.

Als Standardwert werden die letzten 500 Befehle gespeichert. Einstellen lässt sich dieser Wert mit einem Editor [1] in der Datei ~/.bashrc. Mit dem Eintrag export HISTSIZE=2000 wird die History z.B. auf 2000 Befehle erweitert.

Gezieltes Blättern in der History aktivieren

Um die History der Bash gezielt zu durchblättern, lohnt es sich, folgende Zeilen in der Datei /etc/inputrc einzufügen [1]:

"\e[5~": history-search-backward
"\e[6~": history-search-forward

Möchte man diese Funktion nur für einen bestimmten User aktivieren und nicht systemweit, so kopiert man die Datei /etc/inputrc nach /home/$USER/.inputrc, und nimmt die Änderung dort vor.

Durch Drücken der Tasten Bild ↑ und Bild ↓ kann man die History der Bash anschließend nach Einträgen durchsuchen, welche mit den Worten beginnen, die vor der aktuellen Cursorposition stehen. Beispiel:

sudo vi⌷ /etc     # ⌷ = Cursor 

Drückt man jetzt Bild ↑ oder Bild ↓ , wird die History nach Einträgen durchblättert, welche mit sudo vi beginnen.

Beachte: Wird die /home/$USER/.inputrc verwendet, muss darin in der ersten Zeile

$include /etc/inputrc

stehen, damit die Einstellungen darin ebenfalls beachtet werden.

Durchsuchen der History

Die Befehlsliste lässt sich mit der Tastenkombination Strg + R durchsuchen. Durch Eingabe von

history 

lässt sich auch eine Liste der eingegebenen Befehle ausgeben, die man mit Hilfe von egrep filtern kann:

history| egrep webserver 

gibt zum Beispiel alle Befehle an, die die Zeichenfolge "webserver" enthalten haben.

Indem man einer Zeichenfolge ein Ausrufezeichen voranstellt, sucht die Bash in der History nach dem letzten Eintrag, der mit den selben Zeichen beginnt und führt diesen Befehl aus.

Deaktivierung der History

Es kann aus Sicherheitsgründen unter bestimmten Umständen sinnvoll sein, die History der Bash zumindest für root zu deaktivieren. Dazu muss man die Datei ~/.bash_history löschen und in der Datei ~/.bashrc folgende Zeile eintragen:

unset HISTFILE

Bestimmte Befehle von der History ausschließen

Will man nur bestimmte Befehle nicht in der History speichern, so kann man mit der Variable HISTIGNORE eine schwarze Liste erstellen. Hierzu trägt man beispielsweise

HISTIGNORE="truecrypt -P*:sudo*"

in die Datei ~/.bashrc ein [1]. Dadurch werden alle Befehle, die mit truecrypt -P oder mit sudo beginnen, von der History ausgeschlossen.

Löschen der History

Mit dem Befehl

history -c 

löscht man die komplette History der aktiven Shell. Einzelne Zeilen lassen sich löschen mit

history -d NNN 

NNN repräsentiert hierbei einen dreistelligen Zahlenwert der entsprechenden Zeile.

Autovervollständigung

Die Bash bietet die Möglichkeit, Befehle und Dateinamen nach dem Eingeben der ersten Zeichen automatisch zu vervollständigen. Dies erreicht man durch drücken der Tabulatortaste Tab ⇆ . Beispiel:

cd /home/bla 

ergibt durch das Drücken von Tab ⇆ :

cd /home/blackbird 

Allerdings nur, wenn der Ordner /home/blackbird existiert. Sollte es die Ordner blackbird_1 und blackbird_2 geben, macht er das:

cd /home/bla 

ergibt das Drücken von Tab ⇆ :

cd /home/blackbird_ 

und wartet, bis ein zusätzlicher Buchstaben eingegeben wird. Man kann sich mittels "Doppeltab", also das erneute Drücken von Tab dann auch die zur Verfügung stehenden Möglichkeiten zur Vervollständigung ausgeben lassen.

Das Geräusch (Piepen), das ertönt, wenn die Autovervollständigung aufgrund von Mehrdeutigkeiten fehlschlägt, lässt sich durch folgenden Eintrag z.B. in der ~/.bashrc (systemweit: /etc/bash.bashrc) ausschalten:

set 'bind bell-style none'

In /etc/inputrc lassen sich ebenfalls einige (systemweite) Änderungen vornehmen:

set bell-style none   --> Ruhe
set bell-style visible  --> Window flasht

Möchte man diese Funktion nur für einen bestimmten User aktivieren (und nicht systemweit), so kopiert man die Datei /etc/inputrc nach /home/$USER/.inputrc und nimmt die Änderung dort vor.

Die Bash lässt sich durch den folgenden Eintrag dazu bewegen, die existierenden Möglichkeiten gleich anzuzeigen (ohne den Doppeltab):

set show-all-if-ambiguous on

Groß/Kleinschreibung ignorieren:

set completion-ignore-case on

Normalerweise komplettiert die Bash soweit, wie eindeutige Möglichkeiten vorhanden sind und wartet dann auf eine Eingabe durch den Benutzer. Man kann aber auch durch die vorhandenen Möglichkeiten einfach 'durchtabben', indem man in /etc/inputrc folgendes (nach der if mode=emacs Zeile) einträgt:

Control-i: menu-complete

Um doch noch die Variante mit Anzeige der Möglichkeiten zu Verfügung zu haben, muss diese Zeile eingefügt werden:

"\C- ": complete

Jetzt kann man mit Tab durch die Möglichkeiten wechseln, und mit Strg-Leertaste die Möglichkeiten anzeigen lassen.

Programmierbare Vervollständigung der Bash aktivieren

Mit dieser Funktion lässt sich die Autovervollständigung nicht nur für Befehle und Dateinamen, sondern auch zum Beispiel für Optionen verwenden. Die programmierbare Vervollständigung der Bash lässt sich aktivieren, in dem man in /etc/bash.bashrc oder ~/.bashrc den folgenden Block wie in diesem Beispiel

# aktiviert Bashvervollständigung in interaktiven Shells
if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

durch Entfernen der #-Zeichen am Zeilenanfang einkommentiert. Ausprobieren lässt es sich zum Beispiel mal mit

apt-get install 

und dem Drücken der Tab ⇆ -Taste.

Sollte die programmierbare Vervollständigung selbst nach erneutem Einloggen nicht funktionieren, muss unter Umständen das Paket bash-completion installiert werden.

Wildcards

Joker oder Wildcards können für beliebige Zeichen stehen. Zum Beispiel kann man mit

ls *.png 

alle Dateien mit der Endung .png anzeigen.

* ersetzt beliebig viele Zeichen
? ersetzt genau ein Zeichen

Es ist auch möglich, Textteile aus Wortgruppen auszuwählen:

{WORT1,WORT2,WORT3} Wenn eines der genannten Wörter vorkommt

An der Stelle, wo diese Ersetzung auftritt, muss eines der aufgeführten Wörter vorkommen. Zum Beispiel können wir auf diese Weise alle .png Dateien anzeigen:

ls *.{png,PNG,Png,pNg,pnG,PNg,pNG} 

Es gibt auch die Möglichkeit, ein einzelnes Zeichen aus einer Liste an einer Stelle zu erwarten:

[abcd] wenn einer der Buchstaben vorkommt

Obiges Beispiel lässt sich also auch so erreichen:

ls *.[jJpP][pPnN][gG] 

findet .jpg und .png Dateien (würde jedoch auch *.ppg- oder *.jng-Dateien finden, wenn es sie gäbe). Wobei man mit

[j-p] auch alle Buchstaben von j bis p auswählen kann

ls *.[k-p][m-r]g 

findet nun zum Beispiel auch eine *.log-Datei

Spezielle Aktionen, wenn ein Befehl nicht gefunden wird

Sollte ein eingegebener Befehl nicht gefunden werden, so wird standardmäßig command-not-found aufgerufen. Das passiert über die Funktion command_not_found_handle. Diese kann auch umdefiniert werden. Ein Beispiel dafür ist das abfangen eines Tipp-/Eingabefehlers beim Benutzen der Vervollständigung: Man tippt manchmal zwei Buchstaben, dann Tab ⇆ und erwischt dann beim Drücken von auch die # -Taste. Abfangen kann man das mit folgender Funktion:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
command_not_found_handle() {
    cmd_ohne_hash="${1/\#}"

    if [ "$1" != "$cmd_ohne_hash" ]
    then
        shift
        echo "$cmd_ohne_hash $@"
        $cmd_ohne_hash $@
        return $?
    fi
}

Dieser Funktion fehlt aber dann die Fähigkeit, command-not-found aufzurufen. Günstiger ist es also die bestehende Funktion zu erweitern.

Hintergrundprozesse

Prozess direkt im Hintergrund starten

Um einen Prozess im Hintergrund zu starten, hängt man einfach ein & an den Befehl an:

/usr/bin/xeyes & 

Möchte man den Prozess jedoch zusätzlich von der Benutzer-Sitzung lösen (damit diese geschlossen werden kann, während der Prozess weiterläuft) ist die Verwendung von disown notwendig:

/usr/bin/xeyes & disown 

Es empfiehlt sich aber, die vom Prozess erzeugte Ausgabe auf stdout bzw. stderr entweder in eine Logdatei umzuleiten. Dazu verwendet man bspw. nohup (wird wie sudo VOR dem eigentlichen Befehl notiert):

nohup /usr/bin/xeyes > xeyes.log 2>&1 & 

Prozess unterbrechen und/oder in den Hintergrund schicken

Wenn man ein Programm oder einen Prozess in der Shell gestartet hat, kann man ihn mit der Tastenkombination Strg + Z einfrieren. Nun ist die Shell wieder freigegeben und man kann zum Beispiel Daten, die vom Prozess verwendet werden, bearbeiten oder sichern. Mit dem Befehl

fg 

läuft der Prozess anschließend wieder (auf der Shell) weiter. Möchte man die Shell dauerhaft freigeben (also während der Prozess weiterläuft), gibt man statt fg

bg 

ein, um den Prozess in den Hintergrund zu schicken. Nun kann man die Shell weiter benutzen oder auch schließen, während der Prozess im Hintergrund läuft.

Skripte

Viele Aufgaben lassen sich mit Hilfe von Bash-Skripten automatisieren. Unter Skripte wird eine Beispielsammlung mit Skripten zusammengetragen. Wer selbst in das Thema einsteigen möchte, sollte sich den Artikel Shell/Bash-Skripting-Guide für Anfänger anschauen.

ubuntuusers.local › WikiBash