Du bist hier:Start»Linux»Automatisierung»Bash

10 Tipps zur effizienten Benutzung der Bash

terminal icon Bei meiner Arbeit als Software-Entwickler benutze ich täglich die Bourne again Shell (bash) in einem Terminal. Leider sehe ich bei einigen Mitmenschen, dass sie dieselben Befehle immer wieder neu auf der Kommando-Zeile eintippen. In diesem Artikel gebe ich Tipps, wie die Bash besser und effizienter benutzt werden kann, um sich die Arbeit zu erleichtern. Mittlerweile habe ich die Tipps zur effizienten Benutzung der Bash in zwei Video-Beiträgen auf Youtube hochgeladen.

1. Tab ist dein Freund

tabulator key

Mit der Tabulator-Taste lassen sich angefangene Befehle, Parameter von Befehlen oder Dateinamen vervollständigen. Diese Funktion nennt sich Bash-Completion und ist in modernen Linux-Distributionen normalerweise vorhanden und eingeschaltet. Ein Beispiel: nach Eingabe von "ali" und Drücken der Tabulator-Taste ergänzt die Shell "ali" zu "alias":

ali <press tabulator>

# result:
alias

# works also for directories
/sb <press tabulator>

# result:
/sbin/

Sollte beim einmaligen Drücken der Tabulator-Taste der Befehl nicht vervollständigt werden, muß die Tabulator-Taste ein zweites Mal gedrückt werden. Dann erscheint eine Liste mit möglichen Ergänzungen. Beispiel:

al <press tabulator>

# result:
alias alsactl ...

Unter dem Stichwort Bash-Completion finden sich im Internet genügend Anleitungen um eine eigene Autovervollständigung einzurichten.

Übrigens: Der Cursor muss nicht am Ende eines Befehls stehen, um Enter zu drücken. Enter funktioniert auch mit jeder anderen Cursorposition in einer Befehlszeile.
Noch ein kleiner Tipp: die beiden Zeichen !$ (Ausrufezeichen und Dollar-Zeichen) benutzen den letzten Parameter der vorhergehenden Kommandozeile. Beispiel:

echo world > hello.txt

mv hello.txt world.txt

# !$ uses the last parameter - in this example "world.txt"
cat !$

# output:
world

2. Alias

Einige Befehle brauche ich in der täglichen Arbeit immer wieder. Natürlich möchte ich diese Befehle nicht in voller Länge jedes Mal ausschreiben. Dafür gibt es in der Bash den Befehl alias. Wenn ich zum Beispiel in das Download-Verzeichnis wechseln möchte, brauche ich mit dem folgenden Alias nicht "cd ~/Download" eingeben sondern nur den Buchstaben "d" und Enter drücken.

# some examples for the usage of alias

# change to directory Download
alias d='cd ~/Download'

# list files with attributes in long format:
alias l='ls -lisa'

# change directory even shorter:
alias c='cd'

Da das Einrichten eines dauerhaften Alias relativ aufwendig ist, habe ich eine Shell-Funktion geschrieben, die in die Datei ~/.bashrc eingefügt werden kann. Diese Shell-Funktion kann über den Befehl "a <aliasName>" für das letzte von Hand eingegebene Kommando einen alias setzen.

# download the shell function
wget https://www.torsten-traenkner.de/linux/setAliasForLastCommand.txt

# add it to your .bashrc
cat setAliasForLastCommand.txt >> ~/.bashrc

# that was the preparation - here is a usage example


# enter an often used command, e.g.
cd ~/Download

# set an alias for it
a d

# that's all - now you can use the alias d to change into the download directory

3. Bashrc

In der Datei ~/.bashrc im Home-Verzeichnis des Benutzers können alle Bash-Einstellungen gespeichert werden - zum Beispiel die "alias"-Kommandos aus dem obigen Beispiel. Beim nächsten Start einer Bash sind diese Einstellungen verfügbar. Außerdem kann die Datei .bashrc auch in der aktuellen Shell geladen werden.

# load the bashrc manually
source ~/.bashrc

# is the same as
. ~/.bashrc

Um zu überprüfen, ob die Datei ~/.bashrc beim Starten der Bash aufgerufen wird, kann eine Zeile mit "echo 'in bashrc'" am Anfang der Datei eingefügt werden. Sollte die Datei ~/.bashrc nicht geladen werden, dann muss sie in die Datei ~/.profile eingetragen werden. Ein Beispiel für die .bashrc ist hier.

4. Bash-History

Von den bereits eingegebenen Befehlen existiert ein Verlaufsspeicher - die bash history. Um einen bereits eingegebenen Befehl wieder aus der History zu holen, können die Cursor-Tasten hoch und runter benutzt werden (^ oder V). Außerdem gibt es den Befehl history:

# show commands in the bash history
history

# or
cat ~/.bash_history

# show all commands from the history that contain "cd"
history | grep cd

Um rückwärts in der History zu suchen, eignet sich die Tastenkombination Control + r (auf deutschen Tastaturen Strg + r). Beim Tippen des Befehls werden automatisch die bereits getippten Befehle gesucht. Bei erneutem Drücken von Control + r wird die History weiter durchsucht. In der Datei ~/.bashrc können die Einstellungen der Bash-History dauerhaft gespeichert werden. Zum Beispiel kann über den Parameter HISTFILESIZE die Anzahl der gespeicherten Befehle in der History-Datei eingestellt werden.

# add the following lines to ~/.bashrc

#### related to bash history ####
# ignore commands that start with a space and ignore duplicates
HISTCONTROL=ignoredups:ignorespace

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=5000
HISTFILESIZE=100000

#### related to key bindings ####
# search history with "control" + "cursor up" or "cursor down"
# this depends on the keyboard settings
bind '"\e[1;5A":history-search-backward'
bind '"\e[1;5B":history-search-forward'

Zu den Tastenkombinationen der bind-Befehle schreibe ich im Abschnitt Tastenkombination einrichten ausführliche Erklärungen.

5. Vorhandenene Tastenkombinationen

In aktuellen Linux-Distributionen sind bestimmte Tastenkombinationen für die Bash voreingestellt. Hier sind die wichtigsten:

  • Control + a - an den Anfang der Kommandozeile springen
  • Control + b - Cursor nach links
  • Control + c - aktuelles Kommando abbrechen / Kommandozeile ohne Ausführen überspringen
  • Control + d - Buchstabe löschen (wie Entfernen-Taste)
  • Control + e - ans Ende der Kommandozeile springen
  • Control + f - Cursor nach rechts
  • Control + h - Buchstabe rückwärts löschen (wie Backspace-Taste)
  • Control + i - wie Tabulator
  • Control + k - Rest der Kommandozeile ab Cursor löschen
  • Control + l - Terminalausgaben löschen bzw. nach oben schieben
  • Control + q - angehaltene Terminalausgaben fortsetzen (sie Control + s)
  • Control + r - Rückwärts-Suche in der Bash-History
  • Control + s - Terminalausgaben anhalten (siehe Control + q)
  • Control + t - zwei Buchstaben miteinander vertauschen
  • Control + u - Anfang der Kommandozeile vor dem Cursor löschen
  • Control + v - Tastendrücke in Zeichenkette umwandeln
  • Control + w - vorheriges Wort löschen
  • Control + y - folgendes Wort löschen
  • Control + z - Programm in den Hintergrund schicken (Stichwort bg, fg)

Einen Teil dieser Tastenkombinationen zeigt der bind-Befehl an:

# show available short cuts
bind -P

# or in another format
bind -p

6. Eigene Tastenkombination einrichten

Zusätzlich zu den voreingestellten können auch eigene Tastenkombinationen mit dem bind-Befehl definiert werden. Zunächst muß die Darstellung einer Tastenkombination für den Bind-Befehl gefunden werden. Durch Drücken von Control + v und anschließendem Drücken der Tastenkombination kann die Zeichenkette für bind gefunden werden.

Ein Beispiel: um in der Bash History einen alten Befehl zu finden, möchte ich die Tastenkombination "Steuerung" + "Cursor hoch" benutzen. Dazu drücke ich Control + v und anschließend Control + ^ (Cursor hoch). Im Terminal erscheinen bei mir daraufhin die folgenden Zeichen:

^[[1;5A

Für den Bind-Befehl sind die Zeichen ^[ wie ein Escape zu interpretieren und als \e zu schreiben. Für die Rückwärtssuche in der Bash History ergibt sich folgender Bind-Befehl:

# search bash history with control + cursor up
bind '"\e[1;5A":history-search-backward'

# same with cursor + down to search forward
bind '"\e[1;5B":history-search-forward'

Die Zeichen der Tastenkombination in dem Beispiel können in einer anderen Linux-Konfiguration anders aussehen. Deshalb immer mit Control + v vorher testen. Tastenkombinationen mit Control + <Buchstabe> können durch "\C-<Buchstabe>" in den Bind-Befehl eingegeben werden (z.B. "\C-u").

7. Shell-Funktionen

Manchmal reichen die Alias-Definitionen nicht aus. Dann kommen Shell-Funktionen ins Spiel. Eine Shell-Funktion muss nicht immer in einem Shell-Skript definiert werden. Sie kann auch in die Datei ~/.bashrc eingetragen werden. Hier ein Beispiel um eine Datei mit Openoffice im Hintergrund zu öffnen:

function s () {
  soffice "$1" >/dev/null 2>&1 &
}

# call with:
s MyDocument.odt

Zwei sinnvolle Shell-Funktion habe ich in setAliasForLastCommand definiert. Die erste Shell-Funktion mit dem Alias a dient zum schnellen Einrichten einen Alias für den zuletzt eingegebenen Befehl (siehe oben). Die zweite Shell-Funktion mit dem alias g kann die Datei oder das Verzeichnis mit dem neuesten Zeiitstempel bearbeiten. Zum Beispiel bei einem neu angelegten Verzeichnis in dieses wechseln.

# download the shell function
wget https://www.torsten-traenkner.de/linux/setAliasForLastCommand.txt

# add it to your .bashrc
cat setAliasForLastCommand.txt >> ~/.bashrc

# that was the preparation - here is a usage example


# enter g to change to the newest directory, e.g.
mkdir newDirectory

g
# goes into the new directory

8. Der Desktop-Bus (dbus)

bus

Der Desktop-Bus (dbus) bietet eine Möglichkeit grafische Programme von der Kommandozeile aus zu steuern. Was hat das mit der effizienten Benutzung der Bash zu tun ? Die Antwort ist einfach. Da die KDE-Konsole mit der Bash ein grafisches Programm ist, kann es von der Kommandozeile aus per dbus für eine Art "Sitzungsverwaltung" verschiedener Terminals benutzt werden. Auf meiner Webseite stelle ich ein Shell-Skript mit dbus-Kommandos zur Verfügung. Das Shell-Skript habe ich unter Ubuntu 12.04 mit installierter konsole und dem Programm qdbus getestet.

# download example dbus script
wget https://www.torsten-traenkner.de/linux/automation/dbusScript.sh

# make shell script executable
chmod 755 dbusScript.sh

# run the shell script
./dbusScript.sh &

In dem obigen Shell-Skript können die Arrays tabTitle und commands an die individuellen Bedürfnisse angepaßt werden.

9. Expect-Skripte

Expect ist ein Programm, das Befehle an die Bash senden und die darauffolgenden Ausgaben durch ein Skript auswerten kann. Im Gegensatz zu einem "normalen" Shell-Skript ist Expect für die Interaktion mit den Ausgaben eines Programms ausgerichtet. In dem englischen Wikipedia-Artikel sind einige Beispiele vorhanden. Das Internet ist voll mit weiteren Beispielen zu Expect. Eine der häufigsten Anwendungen von Expect ist das automatische Einloggen in einen anderen Computer per SSH. Dabei sollte bedacht werden wie Benutzername und Passwort gespeichert werden. Am besten sollte die Festplatte, auf der ein Expect-Skript mit Benutzerdaten gespeichert ist, verschlüsselt sein. Im laufenden System sollte das Expect-Skript nur für den ausführenden Benutzer lesbar sein (chmod 700 expect_script.exp). Es folgt ein einfaches Beispiel eines Expect-Skripts (die Erklärung befindet sich darunter).

cat > expect_script.exp <<EOF
#!/usr/bin/expect -f

# wait 3 seconds for a response
set timeout 3

# get a Bash shell
spawn -noecho bash

# wait for a prompt that contains a space or a tilde
expect {
  " " {}
  "~" {}
}

# type something
send "echo I am in a new shell. Now exiting.\n"

# leave the created bash
send "exit\n"

# hand over control to the user
interact

exit
EOF

# make the script executable
chmod 700 expect_script.exp

# run the script
./expect_script.exp

Zunächst wird für Expect ein Timeout von 3 Sekunden gesetzt. Sollte die Antwort des Programms nicht innerhalb von 3 Sekunden kommen, dann bricht Expect ab. In diesem Beispiel wird das Programm Bash gestartet. Expect erwartet, dass ein Leerzeichen oder eine Tilde durch die Eingabeaufforderung der Bash ausgegeben wird. Sobald eines dieser Zeichen erscheint, wird der Befehl "echo" und anschließend "exit" an die Bash gesendet. Der Expect-Befehl "interact" übergibt die Kontrolle an die Benutzerin / den Benutzer. "interact" wird zum Beispiel nach dem Einloggen in einen anderen Computer benutzt, da ansonsten das Expect-Skript beendet wird und sich wieder ausloggt. Mit Expect können täglich wiederkehrende Eingaben automatisiert werden.

Zur Automatisierung von grafischen Programmen gibt es xautomation bzw. xte und das xdotool.

10. SSH-Schlüssel

public private keys

Beim Einloggen in einen anderen Computer über SSH muss normalerweise ein Passwort eingegeben werden. Das Public-Private-Key-Verfahren macht die Passwort-Eingabe überflüssig. Zunächst muss mit dem Programm ssh-keygen ein privater und ein öffentlicher digitaler Schlüssel erzeugt werden (~/.ssh/id_rsa*). Anschließend wird mit dem Programm ssh-copy-id der öffentliche Schlüssel auf den anderen Computer in die Datei ~/.ssh/authorized_keys eingetragen. Jetzt sollte das Einloggen per ssh ohne Passwort funktionieren.

# remove old public private keys if they exist
rm -f ~/.ssh/id_rsa*

# now create a public private key pair without password
ssh-keygen -f ~/.ssh/id_rsa -t rsa -q -N ""

# copy the public key to the remote computer into ~/.ssh/authorized_keys
ssh-copy-id user@machine

# now try to log in to the remote machine without password
ssh user@machine

Für user@machine muss natürlich der entsprechend Benutzername und der Rechnername des entfernten Computers eingetragen werden.

Das waren meine 10 wichtigsten Tipps, um die tägliche Arbeit mit der Bash zu erleichtern.

Falls noch etwas unklar sein sollte, dann kannst du die Kommentar-Funktion benutzen, um eine Frage zu stellen.

Kommentar schreiben

Ihre Daten werden verschlüsselt übertragen. Der Kommentar wird gelesen und eventuell veröffentlicht.
Wenn der Inhalt des Kommentars oder Teile des Kommentars nicht veröffentlicht werden, dann werden die gespeicherten Daten nach maximal 4 Wochen gelöscht. Um zukünftigen Missbrauch der Kommentarfunktion zu verhindern, werden die zum Kommentar gehörenden IP Adressen maximal 4 Wochen gespeichert.