21 Oktober 2013 10:36

Flexible bash Konfiguration

Meine ~/.bashrc ist inzwischen recht umfangreich, hinzu kommt noch eine lange ~/.bash_alias. Hinzu kommt, dass ich diese Dateien via git versioniere und auf mehreren Computern nutze.

Mein Problem war nun, dass ich auf unterschiedlichen Computern auch unterschiedliche Anforderungen an die Bash-Konfiguration habe, aber nicht mehrere Versionen pflegen möchte, da sie sich größtenteils überschneiden. Außerdem wollte ich eine bessere Übersicht darüber haben.

Für meine Lösung habe ich mich an einem gebräuchlichen Pattern in /etc gehalten (z.B. in /etc/fonts/conf.d oder /etc/profile.d): Ich habe meine ~/.bashrc in mehrere Dateien aufgeteilt und lese diese nacheinander in der ~/.bashrc ein. Um die relevanten Einstellungen auszuwählen, symlinke ich die gewünschten Dateien in ~/.bashrc.d.

~
├── .bashrc
├── .bashrc.avail/
│   ├── 00-bash-environment.sh
│   ├── 10-bash-prompt.sh
│   ├── 11-xterm-title.sh
│   ├── 20-terminal-colors.sh
│   ├── 50-alias-apt.sh
│   ├── 50-alias-colors.sh
│   ├── 50-alias-force-en.sh
│   ├── 50-alias-interactive.sh
│   ├── 50-alias-ls.sh
│   ├── 50-alias-misc.sh
│   ├── 50-alias-udisks2.sh
│   ├── 50-alias-udisks.sh
│   ├── 80-environment-misc.sh
│   └── 80-texmf.sh
└── .bashrc.d/
    ├── 00-bash-environment.sh -> ../.bashrc.avail/00-bash-environment.sh
    ├── 10-bash-prompt.sh -> ../.bashrc.avail/10-bash-prompt.sh
    ├── 11-xterm-title.sh -> ../.bashrc.avail/11-xterm-title.sh
    ├── 20-terminal-colors.sh -> ../.bashrc.avail/20-terminal-colors.sh
    ├── 50-alias-colors.sh -> ../.bashrc.avail/50-alias-colors.sh
    ├── 50-alias-force-en.sh -> ../.bashrc.avail/50-alias-force-en.sh
    ├── 50-alias-interactive.sh -> ../.bashrc.avail/50-alias-interactive.sh
    ├── 50-alias-ls.sh -> ../.bashrc.avail/50-alias-ls.sh
    ├── 50-alias-misc.sh -> ../.bashrc.avail/50-alias-misc.sh
    ├── 50-alias-udisks2.sh -> ../.bashrc.avail/50-alias-udisks2.sh
    └── 80-environment-misc.sh -> ../.bashrc.avail/80-environment-misc.sh

Meine ~/.bashrc sieht dann wie folgt aus:

_BASH_CONFIG=~/.bashrc.d
_BASH_CACHE=~/.bashrc.cache
_BASH_LOAD=true
_BASH_FORCE_LOAD=false

# use cached file if available
if [ -f "$_BASH_CACHE" ]; then
    . "$_BASH_CACHE"
    _BASH_LOAD=false
fi

# source all configuration files
if [ -d "$_BASH_CONFIG" ] && ($_BASH_LOAD || $_BASH_FORCE_LOAD); then
    for file in $_BASH_CONFIG/*.sh; do
        if [ -f "$file" ]; then
            . "$file"
        fi
    done
fi

# generate config cache
function bash-mkconfig() {
    echo -n > "$_BASH_CACHE"

    if [ -d "$_BASH_CONFIG" ]; then
        for file in $_BASH_CONFIG/*.sh; do
            if [ -f "$file" ]; then
                echo -e "##\n## $file\n##\n" >> "$_BASH_CACHE"
                cat "$file" >> "$_BASH_CACHE"
                echo -e "\n\n" >> "$_BASH_CACHE"
            fi
        done
    fi
}

unset _BASH_LOAD
unset _BASH_FORCE_LOAD

Durch die zusätzlichen Dateien wird das Starten der Bash minimal langsamer (gemessen via time . .bashrc), aber auch dafür habe ich eine Lösung: Ähnlich wie bei grub-mkconfig habe ich mir die Funktion bash-mkconfig geschrieben, welche die Dateien zusammenfügt und in ~/.bashrc.cache speichert. Wenn diese Datei vorhanden ist, wird ~/.bashrc.d nicht eingelesen.

Kommentare

Franz, 21.10.2013 12:39
Willste mal deine Configs veröffentlichen? :P
SammysHP, 22.10.2013 21:08
Die liegen momentan alle zusammen in einem git-Repository (bash, vim, awesome, tmux, ssh, …), darunter auch einige persönliche Daten. Habe schon seit langem vor, das aufzuräumen und dann zu veröffentlichen.

So richtig viel spannendes steht aber nicht drin. Ausgangspunkt war eine Beispiel-Config (von Ubuntu?), die ich nach und nach erweitert habe, aber nicht allzu viel. Sind halt so Sachen wie vi-Mode (set -o vi), EDITOR, VISUAL, HISTSIZE, Prompt (PS1='\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ') etc.

Habe die .bashrc alleine hier für dich hochgeladen: https://gist.github.com/SammysHP/7106317
Powered by BetaBlog
Login | RSS Beiträge RSS Kommentare Impressum