Bash-Konfiguration

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen
Wiki ‹ Standardprogramme Office und Co ‹ Bash-Konfiguration


Getestet.png Getestet: Dieser Hinweis soll dir dabei helfen, zu entscheiden, ob dieser Artikel auf deinem System funktionieren wird oder nicht. Solltest du feststellen, dass dieser Artikel bei einer ungetestet Version funktioniert, kannst du das gerne hier korrigieren oder im Forum anmerken.



Dieser Wikiartikel ist ein Mitmachbeitrag, Ergänzungen und weitere Kniffe sind ausdrücklich erwünscht! Bitte umreisse in den Anmerkungen beim Veröffentlichen aber kurz deine Änderungen, das hilft bei der Orientierung. Danke!


Warnung.png Warnung: Ändere deine Bash-Konfiguration nur, wenn du weisst, was du tust!


Einleitung

Die Bourne-again Shell

Debianpackage.png bash ist die Standard-Shell bei Debian, also ein fundamentaler Bestandteil des Systems. Ähnlich wie Debianpackage.png zsh oder Debianpackage.png fish lässt sich auch Bash umfassend konfigurieren und den eigenen Wünschen und Gewohnheiten entsprechend anpassen.

In diesem Artikel soll es um einige Kniffe in der grundlegenden Konfiguration gehen. Eine allumfassende Erklärung kann es an dieser Stelle nicht geben, stattdessen werden Beispiele gezeigt, wie es gehen könnte und unten auf die Manpages und weitere nützliche Links verwiesen.

Konfigurationsdateien

Die wohl wichtigsten Konfigurationsdateien sind:

~/.bashrc
~/.bash_aliases

Eine weitere mächtige Möglichkeit zur Einstellung des Verhaltens bietet:

~/.inputrc

Weiters gibt es noch die

~/.profile

als Möglichkeit zur Bearbeitung, die in diesem Artikel aber vorerst nicht behandelt wird.

Sämtliche oben genannte Dateien gibt es für jeden User extra, also auch für Root, in deren jeweiligem Home-Verzeichnis.

Die ursprüngliche ~/.bashrc findet man zu jeder Zeit in

/etc/skel/.bashrc
Warnung.png Warnung: Vor dem Bearbeiten der genannten Dateien sollten Backups der ursprünglichen Konfigurationsdateien angelegt werden, um bei Fehlern schnell und einfach "auf Anfang" zurücksetzen zu können!


Warnung.png Warnung: Die Konfigurationsdateien von Root sollten - wenn überhaupt - erst bearbeitet werden, wenn man sich absolut sicher ist, was man tut!


Sourcen

Das sogenannte Sourcen (also das Einbinden weiterer Dateien in die eigentliche Konfigurationsdatei) bietet zumindest zwei Vorteile:

Einerseits kann die ~/.bashrc auf diese Weise aufgeteilt und modular gestaltet werden, was der Übersichtlichkeit dienen kann. Und andererseits ist es auf diese Weise möglich, im eigenen Home-Verzeichnis ein bisschen aufzuräumen, indem man zB. die schon erwähnte ~/.bash_aliases aber auch die ~/.bash_history an einem anderen Ort ablegt (oder auch nach eigenen Bedürfnissen umbenennt).

Sourcen geschieht in der ~/.bashrc durch Einfügen folgender Zeilen, nachdem man die entsprechenden Dateien am angegebenen Ort angelegt hat:

source ~/.config/bconf/bash-aliases
source ~/.config/bconf/bash-env

Im obigen Beispiel wurde in ~/.config der Ordner bconf (Bashconfig) erstellt und dort die Dateien bash-aliases (der Inhalt dürfte klar sein) und bash-env (Bash-Environment) für Umgebungsvariablen, die auch andere Programme nutzen, angelegt. Auch die History von Bash lässt sich in diesen Ordner verlinken, dazu später.

Sämtliche weiter genannten Optionen und Konfigurationen können nun nach Belieben einfach in der eigentlichen ~/.bashrc geschrieben oder auf beliebig viele weitere gesourcte Dateien verteilt werden.

Shell Options

Mit dem Befehl shopt können der Bash Optionen gegeben werden, eine vollständige Liste findet man in der Manpage von bash.

shopt -s cdspell
-> kleinere Rechtschreibfehler in der Namensbezeichnung bei cd werden ausgebessert

shopt -s direxpand
-> Verzeichnisvariablen werden bei Autocemplete mit Tab vollkommen ausgeschrieben

shopt -s dirspell
-> ähnlich zu cdspell, funktioniert aber auch bei anderen Befehlen wie zB. cat, ls...

shopt -s checkwinsize
-> überprüft und korrigiert wenn nötig die Zeilen und Spalten nach jedem Befehl auf Änderungen in der Fenstergröße

shopt -s histappend
-> die History wird erweitert und nicht überschrieben

Funktionen

Durch Einfügen eigener Funktionen, lässt sich die Bash technisch erweitern:

# Starte mit "e PROGRAMMNAME" ein Programm aus dem Terminal heraus, dessen Prozess nicht mehr vom gestarteten Terminal abhängt (man kann es schließen):
function e
{
  $@ 1>/dev/null 2>/dev/null& disown;
}
# Starte mit "v /PFAD/ZUR/DATEI" den Pager Less, auch hier ist der Prozess dann unabhängig vom usrpgl. Terminal:
v(){ xterm -e less "$1" & }

Wir beachten die unterschiedliche Syntax beim Schreiben einer Funktion, viele Wege...

History

Folgende Einträge konfigurieren den Befehl history:

export HISTTIMEFORMAT="%F %H:%M "              # Fügt der History-Ausgabe einen Datums- u. Zeitstempel hinzu
export HISTIGNORE="cd:history*:ls:ll:su -"     # Diese Befehle werden nicht in die History aufgenommen
HISTCONTROL=ignoreboth:erasedups               # Ignoriert Befehle mit anfänglichem Leerzeichen und doppelt abgesetzte Befehle, löscht doppelte
HISTFILE=~/.config/bconf/bash-history          # Hier wird die History abgelegt
HISTSIZE=2000
HISTFILESIZE=2000

Prompt

Das Ändern der Informationen, die in der Eingabezeile (Prompt) gezeigt werden, geschieht mittels des Setzens von PS1.

Beispiele für veränderte Prompts wären:

PS1='$(pwd) >' # Einfärbiger Einzeiler

/home/username/.config >
PS1='\[\e[01;34m\]\w\[\e[0m\]$\[\e[0m\] ' # Zweifärbiger Einzeiler

~/.config$
PS1='\[\e[34;1m\]\w \[\e[0m\]>\n\[\e[38;5;214m\]\$\[\e[0m\] ' # Dreifärbiger Zweizeiler

~/.config >
$ 

Gib mir einen orange-farbigen Cursor, der so gut aussieht wie bei Grml:

printf '%b' '\e]12;orange\a'

Gib mir nach jeder Eingabe automatisch ein LS aus:

PROMPT_COMMAND=ls

Editor definieren

Durch Einfügen folgender Zeilen kann der Texteditor (in diesem Fall Debianpackage.png micro) userweit als Standard gesetzt werden:

export EDITOR=/usr/bin/micro
export VISUAL=/usr/bin/micro

Farben für den Pager

Mit folgenden Zeilen erhält der Standardpager Debianpackage.png less die Möglichkeit zu farbigen Ausgaben:

export PAGER=/usr/bin/less     # Setzen als Standardprogramm
export LESS_TERMCAP_mb=$'\E[01;34m'
export LESS_TERMCAP_md=$'\E[01;34m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;44;37m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;32m'
export LESSHISTFILE=-          # Lege keine History für less an

Farben für LS

Mit den folgenden (selbsterklärenden) Zeilen wird der Befehl ls angepasst:

LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=00;35:*.mpg=00;35:*.mpeg=00;35:*.m2v=00;35:*.mkv=00;35:*.webm=00;35:*.webp=00;35:*.ogm=00;35:*.mp4=00;35:*.3gp=00;35:*.m4v=00;35:*.mp4v=00;35:*.vob=00;35:*.qt=00;35:*.nuv=00;35:*.wmv=00;35:*.asf=00;35:*.rm=00;35:*.rmvb=00;35:*.flc=00;35:*.avi=00;35:*.fli=00;35:*.flv=00;35:*.gl=00;35:*.dl=00;35:*.xcf=00;35:*.xwd=00;35:*.yuv=00;35:*.cgm=00;35:*.emf=00;35:*.ogv=00;35:*.ogx=00;35:*.aac=02;36:*.au=02;36:*.flac=02;36:*.m4a=02;36:*.mid=02;36:*.midi=02;36:*.mka=02;36:*.mp3=00;36:*.aax=00;36:*.mpc=02;36:*.ogg=02;36:*.ra=02;36:*.wav=00;36:*.oga=02;36:*.opus=02;36:*.spx=02;36:*.xspf=02;36:*.odt=00;33:*.ods=00;33:*.ott=00;33:*.ots=00;33:*.txt=01;33:*.pdf=02;33';
export LS_COLORS
export LS_OPTIONS='-ph --group-directories-first --color=auto'

Aliases

Das Definieren von Aliases ist ein weites Feld, hier einige Beispiele:

alias ..='cd ..'
alias c='clear'
alias dir='dir --color=auto'
alias ll='ls $LS_OPTIONS -l --time-style=long-iso'
alias ls='ls $LS_OPTIONS -a'
alias stat='stat --printf "\n Datei:      %n (%F)\n Größe:      %s bytes\n Rechte:     %A (%a)\n Uid/Gid:    %U/%G (%u/%g)\n Erstellung: %w\n Änderung:   %y\n Zugriff:    %x\n\n"'
alias vdir='vdir --color=auto'
alias x='exit'
alias cp='cp -v'
alias mv='mv -v'
alias o='xdg-open'
alias rm='rm -v'
alias rm='rm -i'  (Löschen mit interaktiver Nachfrage um versehentliches Löschen zu verhindern)
alias dl='cd ~/downloads/; clear; ls -1p'
alias h='history'
alias v='sudo -E vim' (Programmaufruf mit Passwortabfrage)

Zur weiteren Inspiration sei hier noch auf den Alias-Adventskalender von 2020 verwiesen, in dem man nach jedem Buchstaben auch den zugehörigen Thread findet, in dem viele der aufgelisteten Aliases näher erklärt werden.

Autostart von X

Bei minimalistischen Systemen, die ohne Displaymanager auskommen, kann es praktisch sein, nach dem Einloggen des Nutzers in der TTY, den X-Server automatisch starten zu lassen. Dies wird durch Einfügen des folgenden kleinen Skripts (am Ende der ~/.bashrc) erreicht:

if [ -z "$DISPLAY" ] && [ $(tty) == /dev/tty1 ]; then
    exec startx
fi

Da eine Exec-Anweisung (in diesem Fall startx) praktisch einen Prozess durch einen anderen ersetzt, sollte sie am Ende der Datei stehen. Das kann unerwarteten Fehlern beim Laden von Umgebungsvariablen vorbeugen.

~/.inputrc

Die ~/.inputrc ist eine weitere Möglichkeit, die eigene Bash-Umgebung anzupassen und komfortabler zu gestalten. Auch hier sind die Möglichkeiten fast unbegrenzt, mehr dazu findet man in der Manpage von readline.

An dieser Stelle nur einige Beispiele:

$include /etc/inputrc              # Inkludiere systemweite Einstellungen
set colored-stats on               # Zeige Verzeichnisse etc. in anderen Farben bei Tabvervollständigung
set colored-completion-prefix on   # Zeige schon eingegebene Zeichen bei Tabvervollständigung in anderer Farbe
set completion-ignore-case on      # Groß-/Kleinschreibung wird bei Tabvervollständigung ignoriert
set completion-map-case on         # Behandle - und _ bei Tabvervollständigung gleich
set echo-control-characters off    # Bei zB. Abbruch mittels Strg+c wird keine Ausgabe in der Prompt gezeigt
set show-all-if-unmodified on      # De facto werden mögliche Vervollständigungen schon nach einmal Tab angezeigt
"\e[A": history-search-backward    # CursorUp blättert bei teilweiser Eingabe nur durch dazu passende Historyeinträge zurück
"\e[B": history-search-forward     # CursorDwn blättert bei teilweiser Eingabe nur durch dazu passende Historyeinträge vor

Schlussbemerkung

Zahlreiche Programme bieten noch eigene Konfigurationsmöglichkeiten, die als Variablen in die ~/.bashrc geschrieben werden können, ähnlich zu ls oder less. Nutzt man diese Möglichkeiten, bietet es sich deshalb irgendwann an, die Bash-Konfiguration modular und damit übersichtlicher zu halten.

Manpages

Weblinks