Bash .bashrc

Ich werde mich auf die benutzerspezifische Konfigurationsdatei für die Bash (Bourne again Shell) konzentrieren.

Die genaue Abfolge - und das Vorhandensein - diverser Konfigurationsdateien und Mechanismen kann bei Distros abweichen und ist nicht immer gleich.

Für die Systemkonfiguration sind diverse weitere Konfigurationsdateien in /etc zu finden:

  • /etc/profile - systemweite Konfiguration von Shells wie Bash, Korn-Shell oder Ur-ahn Sh

  • /etc/profile.d/ - spezifische Zusatzskripte; z.B. bash-completion.sh (Ubuntu/s, Mint)

  • /etc/bash.bashrc - systemweite Bash-Konfiguration (alle Benutzer)

Die Benutzer verfügen über:

  • $HOME/.profile - wieder für mehrere Shell nach Sh-Technik: sh, ksh, bash, zsh, …

  • $HOME/.bashrc - persönliche Bash-Konfiguration (alternativ bei zsh: $HOME/.zshrc)

Eine Basisversion der .bashrc ist bei den Distros jeweils im Skelett für neue Benutzer zu finden: /etc/skel/.bashrc.

Ich lagere meine eigenen Bash-Extras gerne in einer Zusatzdatei aus, die ich dann einfach am Ende der Standard-.bashrc einfügen lasse:

###########################################################
# MY-STUFF - please consider the software in need:
# for powerline-go: go and git (see software baseinstalls)
###########################################################

if [ -e $HOME/.bashrc_JB_MY-STUFF ]; then
    source $HOME/.bashrc_JB_MY-STUFF
    echo 'Extras for .bashrc loadad with .bashrc_JB_MY-STUFF'
fi

Für eine beispielhafte Ergänzung der Standard-.bashrc hier MY-STUFF-Version als Beispiel:

# .bashrc_JB_MY-STUFF - extra stuff expanding the standard .bashrc
# ================================================================


# my own pager with most: sudo apt install most
# or manual color stuff for less and man-pages
if [ -x "$(command -v most)" ]
then
    export PAGER=most
else
    # Tipp mit Farbe für less:
    # https://www.linux-community.de/blog/bunte-manpages-anzeigen-mit-most-und-less/
    export LESS_TERMCAP_mb=$(printf "\e[1;31m") # Blinken
    export LESS_TERMCAP_md=$(printf "\e[1;31m") # Fett
    export LESS_TERMCAP_me=$(printf "\e[0m")  # Modus Ende
    export LESS_TERMCAP_se=$(printf "\e[0m")  # Ende Standout-Modus
    export LESS_TERMCAP_so=$(printf "\e[1;44;33m") # Start Standout-Modus (Info-Kasten)
    export LESS_TERMCAP_ue=$(printf "\e[0m")  # Unterstreichen Ende
    export LESS_TERMCAP_us=$(printf "\e[1;32m")  # Unterstreichen Anfang
fi

# my own aliases - joebstyle
alias jbdf='df -h | grep ^/dev | grep -v ^/dev/loop'

# sudo apt install fortunes cowsay tty-clock
if [ -x "$(command -v cowsay)" ] && [ -x "$(command -v fortune)" ]; then
    # Bit of Fun with cowsay and fortune cookies
    alias jbcowsay='while true; do fortune|cowsay -f tux && sleep 20; done'
fi

if [ -x "$(command -v tty-clock)" ]; then
    alias jbtty-clock="tty-clock -s -f '%A, %d.%m.%Y'"
fi

# more fun with bat/batcat instead of cat
# sudo apt install bat # ubuntu 20.04: Befehl dann batcat - Manpage auch  mit batcat
if [ -x "$(command -v batcat)" ]
then
    alias jbcat="PAGER=less;batcat"
fi

#  individuelle Wallpaper auf 4 Arbeitsflächen!
if [ -x "$(command -v $HOME/Bilder/wallpaper/wallpaper.sh)" ]; then
    alias jbwallpaper="$HOME/Bilder/wallpaper/wallpaper.sh"
fi

# Projektordner mit  VSCODIUM aka codium starten
if [ -x "$(command -v codium)" ]; then
    alias jbcode="codium . &"
fi

# Passwords mystyle with Tool makepasswd: 15 Characters out of string
if [ -x "$(command -v makepasswd)" ]; then
    alias jbmakepasswd="makepasswd --chars 15 --string 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ#+-()=}][{;:'"
fi

# ===========================
# Powerline-Go mit golang-go
# ===========================
# in case of problems with https and/or Security stuff:
# git config --global http.sslVerify false
# and:
# go get -u -insecure github.com/justjanne/powerline-go
# Default stuff:
# ==============
# Remember: install the powerline-fonts aka fonts-powerline and the go-stuff
# https://awesomeopensource.com/project/justjanne/powerline-go
# https://github.com/justjanne/powerline-go
# folder ~/go creating with (needs go and git (needs go and git):
# go get -u github.com/justjanne/powerline-go

export GOPATH="$HOME/go"

function _update_ps1() {
    PS1="$($GOPATH/bin/powerline-go -error $? -newline -theme default -shell bash -modules-right time)"
}

if [ "$TERM" != "linux" ] && [ -f "$GOPATH/bin/powerline-go" ]; then
    PROMPT_COMMAND="_update_ps1; $PROMPT_COMMAND"
fi

# Finish up with the terminals
# Colors for the console with solarized dark
# eval $(dircolors -b ~/.bash_dircolors_solarized_dark)
if [ $TERM == "xterm-256color" ] && [ -e ~/.bash_dircolors_solarized_dark ]
then
    eval $(dircolors -b ~/.bash_dircolors_solarized_dark)
else [ $TERM = "linux" ] && [ -e  ~/.bash_dircolors_solarized_ansi ]
    eval $(dircolors -b ~/.bash_dircolors_solarized_ansi)
fi


# nodejs stuff
# ============
if [ -x $HOME/opt/nodejs/bin/node ]; then
    export PATH=$HOME/opt/nodejs/bin:$PATH
fi

# use npm gulp tar version of nodejs
if [ -f  "/home/joeb/opt/nodejs/bin/gulp" ]; then
    alias gulp='/home/joeb/opt/nodejs/bin/gulp'
fi

# Home-Dir bin - if not already set by Distro
# ============
echo $PATH | egrep "$HOME/bin" >> /dev/null
if [ $? -ne 0 ] && [ -d "$HOME/bin" ]; then
    export PATH=$HOME/bin:$PATH
fi


# Example for FZF with git
# see: https://github.com/junegunn/fzf/wiki/examples#git
# Attention: Software need to be prepared / installed
# fzf, git, xclip and
# diff-so-fancy (Perl Script: https://github.com/so-fancy/diff-so-fancy
# ============================================================================
alias glNoGraph='git log --color=always --format="%C(auto)%h%d %s %C(black)%C(bold)%cr% C(auto)%an" "$@"'
_gitLogLineToHash="echo {} | grep -o '[a-f0-9]\{7\}' | head -1"
_viewGitLogLine="$_gitLogLineToHash | xargs -I % sh -c 'git show --color=always % | diff-so-fancy'"

# fcoc_preview - checkout git commit with previews
fcoc_preview() {
  local commit
  commit=$( glNoGraph |
    fzf --no-sort --reverse --tiebreak=index --no-multi \
        --ansi --preview="$_viewGitLogLine" ) &&
  git checkout $(echo "$commit" | sed "s/ .*//")
}

# fshow_preview - git commit browser with previews
fshow_preview() {
    glNoGraph |
        fzf --no-sort --reverse --tiebreak=index --no-multi \
            --ansi --preview="$_viewGitLogLine" \
                --header "enter to view, alt-y to copy hash" \
                --bind "enter:execute:$_viewGitLogLine   | less -R" \
                --bind "alt-y:execute:$_gitLogLineToHash | xclip"
}

In diesem Beispiel mal ein paar Aufrufe und Nutzungen in der Bash. Das lässt sich dann gerne einmal weiter Richtung Bash-Skripting erweitern.