Bash-Konfiguration
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: Ändere deine Bash-Konfiguration nur, wenn du weisst, was du tust! |
Einleitung
Die Bourne-again Shell
bash ist die Standard-Shell bei Debian, also ein fundamentaler Bestandteil des Systems. Ähnlich wie zsh oder 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: 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: 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
PATH erweitern
Mit folgender Zeile lässt sich die Variable PATH um, zum Beispiel, ~/bin erweitern:
export PATH="$HOME/bin:$PATH"
Diese Methode ist Bash-spezifisch, lässt andere Shells also außen vor.
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 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 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.