====== .bash_profile und .bashrc ====== .bash_profile und .bashrc sind Konfigurationsdateien für die Bash-Shell. Sie werden beim Start einer Shell automatisch ausgeführt und ermöglichen es, Umgebungsvariablen zu setzen, Aliase zu definieren und das Shell-Verhalten anzupassen. ===== Voraussetzungen ===== * Zugriff auf die Linux-Kommandozeile * Grundkenntnisse in [[sammlung:bash_kommandos|Bash-Kommandos]] * Texteditor wie [[sammlung:nano|nano]] oder [[sammlung:vim|vim]] ===== Der Unterschied zwischen .bash_profile und .bashrc ===== ^ Datei ^ Wann wird sie geladen? ^ Verwendung ^ | **.bash_profile** | Login-Shell (SSH, Console Login) | Umgebungsvariablen, PATH, einmalige Setup-Aufgaben | | **.bashrc** | Interaktive Non-Login-Shell (neues Terminal) | Aliase, Funktionen, Prompt-Anpassung | | **.profile** | Login-Shell (wenn .bash_profile fehlt) | POSIX-kompatible Alternative | ===== Wann wird welche Datei geladen? ===== ==== Login-Shell ==== Beim Anmelden via SSH oder Konsole: 1. /etc/profile 2. ~/.bash_profile (wenn vorhanden) ODER ~/.bash_login (wenn vorhanden) ODER ~/.profile ==== Non-Login-Shell ==== Beim Öffnen eines neuen Terminals in der grafischen Oberfläche: 1. /etc/bash.bashrc 2. ~/.bashrc ===== Typischer Aufbau ===== ==== ~/.bash_profile ==== # ~/.bash_profile # PATH erweitern export PATH="$HOME/bin:$HOME/.local/bin:$PATH" # Umgebungsvariablen setzen export EDITOR=vim export VISUAL=vim export BROWSER=firefox # .bashrc laden (wichtig!) if [ -f ~/.bashrc ]; then . ~/.bashrc fi # Einmalige Aufgaben beim Login echo "Willkommen, $(whoami)!" ==== ~/.bashrc ==== # ~/.bashrc # Wenn nicht interaktiv, abbrechen [[ $- != *i* ]] && return # History-Einstellungen HISTSIZE=10000 HISTFILESIZE=20000 HISTCONTROL=ignoredups:ignorespace shopt -s histappend # Prompt anpassen PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' # Aliase alias ll='ls -lah' alias la='ls -A' alias l='ls -CF' alias grep='grep --color=auto' alias ..='cd ..' alias ...='cd ../..' # Funktionen mkcd() { mkdir -p "$1" && cd "$1" } # Auto-Completion aktivieren if [ -f /etc/bash_completion ]; then . /etc/bash_completion fi ===== Häufige Anwendungsfälle ===== ==== PATH erweitern ==== # In ~/.bash_profile export PATH="$HOME/bin:$PATH" export PATH="$HOME/.local/bin:$PATH" export PATH="/opt/myapp/bin:$PATH" # Eigene Programme verfügbar machen mkdir -p ~/bin echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bash_profile ==== Umgebungsvariablen setzen ==== # In ~/.bash_profile export EDITOR=vim export VISUAL=vim export PAGER=less export BROWSER=firefox export LANG=de_DE.UTF-8 export LC_ALL=de_DE.UTF-8 # Anwendungsspezifisch export JAVA_HOME=/usr/lib/jvm/java-17-openjdk export GOPATH=$HOME/go export NODE_ENV=development ==== Nützliche Aliase ==== # In ~/.bashrc # Sicherheitsabfragen alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Verzeichnis-Navigation alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' alias ~='cd ~' alias -- -='cd -' # ls-Varianten alias ll='ls -lah' alias la='ls -A' alias l='ls -CF' alias lt='ls -ltr' # Nach Zeit sortiert # Git-Aliase alias gs='git status' alias ga='git add' alias gc='git commit' alias gp='git push' alias gl='git log --oneline' # System alias update='sudo apt update && sudo apt upgrade' alias ports='netstat -tulanp' alias myip='curl ifconfig.me' # Farbige Ausgabe alias grep='grep --color=auto' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias diff='diff --color=auto' ==== Eigene Funktionen ==== # In ~/.bashrc # Verzeichnis erstellen und hineinwechseln mkcd() { mkdir -p "$1" && cd "$1" } # Datei erstellen und in Editor öffnen touchedit() { touch "$1" && $EDITOR "$1" } # Archiv extrahieren (automatische Format-Erkennung) extract() { if [ -f "$1" ]; then case "$1" in *.tar.bz2) tar xjf "$1" ;; *.tar.gz) tar xzf "$1" ;; *.bz2) bunzip2 "$1" ;; *.gz) gunzip "$1" ;; *.tar) tar xf "$1" ;; *.zip) unzip "$1" ;; *.Z) uncompress "$1" ;; *.7z) 7z x "$1" ;; *) echo "Unbekanntes Format: '$1'" ;; esac else echo "Datei '$1' nicht gefunden" fi } # Größe eines Verzeichnisses dirsize() { du -sh "${1:-.}" } # Backup einer Datei erstellen backup() { cp "$1" "$1.backup-$(date +%Y%m%d-%H%M%S)" } ===== Prompt anpassen ===== ==== Einfacher Prompt ==== # Einfacher Prompt: user@host:dir$ PS1='\u@\h:\w\$ ' # Mit Farben: grüner User, blauer Pfad PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' # Mit Uhrzeit PS1='[\t] \u@\h:\w\$ ' # Root-User rot hervorheben if [ "$EUID" -eq 0 ]; then PS1='\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' else PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' fi ==== Git-Branch im Prompt ==== # Git-Branch anzeigen parse_git_branch() { git branch 2>/dev/null | grep '^*' | colrm 1 2 } PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[01;33m\]$(parse_git_branch)\[\033[00m\]\$ ' ===== Praktische Konfigurationen ===== ==== Entwickler-Setup ==== # ~/.bash_profile export PATH="$HOME/bin:$HOME/.local/bin:$PATH" export EDITOR=vim export VISUAL=vim # Node.js export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # Python export PYTHONPATH="$HOME/python-libs:$PYTHONPATH" alias python=python3 alias pip=pip3 # Go export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin # Rust export PATH="$HOME/.cargo/bin:$PATH" ==== Server-Admin-Setup ==== # ~/.bashrc # Sicherheitsaliase alias rm='rm -i' alias mv='mv -i' alias cp='cp -i' # System-Monitoring alias cpu='top -o %CPU' alias mem='top -o %MEM' alias ports='netstat -tulanp' # Logs alias syslog='sudo tail -f /var/log/syslog' alias auth='sudo tail -f /var/log/auth.log' # Services alias services='systemctl list-units --type=service' alias failed='systemctl --failed' # Disk-Space alias disk='df -h | grep -v loop' alias biggest='du -h / | sort -rh | head -20' ===== History-Einstellungen ===== # In ~/.bashrc # History-Größe HISTSIZE=10000 HISTFILESIZE=20000 # Duplikate ignorieren HISTCONTROL=ignoredups:ignorespace # Zeitstempel in History HISTTIMEFORMAT="%F %T " # History sofort speichern shopt -s histappend PROMPT_COMMAND="history -a" # Bestimmte Befehle nicht speichern HISTIGNORE="ls:ll:cd:pwd:exit:clear:history" ===== Konfigurationsdateien bearbeiten ===== # .bashrc bearbeiten nano ~/.bashrc # Oder mit vim vim ~/.bashrc # Änderungen neu laden (ohne Logout) source ~/.bashrc # Oder . ~/.bashrc # .bash_profile bearbeiten nano ~/.bash_profile source ~/.bash_profile ===== Systemweite Konfiguration ===== ==== /etc/profile ==== Systemweit für alle Benutzer bei Login-Shells: # /etc/profile export PATH="/usr/local/bin:/usr/bin:/bin" export EDITOR=vim # Benutzerspezifische Profile laden for i in /etc/profile.d/*.sh; do if [ -r "$i" ]; then . "$i" fi done ==== /etc/bash.bashrc ==== Systemweit für alle Benutzer bei interaktiven Shells: # /etc/bash.bashrc alias ll='ls -l' PS1='\u@\h:\w\$ ' ==== /etc/skel/ ==== Vorlage für neue Benutzer: # Standard-Dateien für neue Benutzer ls -la /etc/skel/ # .bashrc # .bash_profile # .profile ===== Best Practices ===== * **.bash_profile** lädt immer **.bashrc** (wichtig für Konsistenz) * Umgebungsvariablen in **.bash_profile**, Aliase in **.bashrc** * Vor Änderungen Backup erstellen: ''cp ~/.bashrc ~/.bashrc.backup'' * Änderungen mit ''source ~/.bashrc'' testen vor Logout * Kommentare für späteres Verständnis nutzen * Komplexe Logik in separate Skripte auslagern ===== Debugging ===== # Shell im Debug-Modus starten bash -x # Oder in .bashrc: set -x # Debug an # ... Code ... set +x # Debug aus # Prüfen welche Datei geladen wird echo "Loading .bashrc" # Startup-Zeit messen time bash -c exit # Login-Shell testen bash --login # Non-Login-Shell testen bash ===== Häufige Probleme ===== ==== Änderungen wirken nicht ==== # Neu laden source ~/.bashrc # Oder neue Shell starten bash # Prüfen ob richtige Datei bearbeitet wurde echo $HOME cat ~/.bashrc | grep "meine-änderung" ==== PATH wird nicht gesetzt ==== # In .bash_profile statt .bashrc setzen # Und sicherstellen dass .bash_profile .bashrc lädt # Prüfen: echo $PATH ==== Aliase funktionieren nicht in Skripten ==== # Aliase sind nur für interaktive Shells # In Skripten Funktionen oder volle Befehle nutzen # Oder Alias expandieren: shopt -s expand_aliases ===== Siehe auch ===== * [[sammlung:bash_kommandos|Bash Kommandos]] * [[sammlung:vim|vim - Texteditor]] * [[sammlung:nano|nano - Einfacher Editor]] * [[sammlung:wichtige_konfigurationsdateien|Wichtige Konfigurationsdateien]] * [[sammlung:filesystem|Linux Dateisystem]] {{tag>linux bash shell konfiguration environment aliase}}