Table of Contents
Da ich mit meinem Mac sehr oft auf der Kommandozeile unterwegs bin (dazu empfehle ich übrigens iTerm2 - ein Terminal-Ersatz der alle anderen Anwendungen dieser Art auch auf Linux und Windows aussticht) habe ich mir dafür ein paar kleine Einstellungen zusammengesammelt, die das Leben und Arbeiten auf der Kommandozeile etwas erleichtern.
Was ist Bash?
Bash steht für “Bourn again shell” und ist eine Erweiterung der älteren Bourne-Shell, eine Shell die auf Unix-(ähnlichen) Systemen als Benutzerschnittstelle dient. Und diese ist vor allem daran erkennbar, dass die Steuerung des Systems nur über die Tastatur, ohne Maus und Fenster funktioniert.
Seit der Version 10.3 ist Bash auch Bestandteil von Mac OS X und bringt damit eine Menge Vorteile für die Arbeit auf der Kommandozeile mit sich.
Die Bash Konfigurationsdateien
Die globalen Einstellungen für die Bash befinden sich in der Datei /etc/bashrc und der /etc/profile. Wer Einstellungen auf bestimmte Benutzer beschränken will, kann im Benutzerverzeichnis (du gelangst mit cd ~ dorthin) eine Datei mit dem Name .profile, .bash_login oder .bash_profile anlegen. Beachte, dass .profile nur geladen wird, wenn .bash_login nicht existiert, welche wiederum durch .bash_profile überschrieben wird. Das gilt allerdings nicht, wenn du dich als root-Benutzer anmeldest - dann wird nur die Datei .profile gelesen. Der Grund ist, dass der Root-Benutzer nicht bash sondern sh ausführt, wodurch nur die ~/.profile-Datei berücksichtigt wird.
Hierarchie der Bash-Konfigurations-Dateien
Daneben gibt es theoretisch auch die Möglichkeit, im Benutzerverzeichnis eine Datei mit dem Namen .bashrc anzulegen. Diese wird jedoch nur dann geladen, wenn Bash ausgeführt wird, ohne dass sich ein Benutzer dazu anmeldet (die sogenannte non-login-shell). Im OS X-Umfeld wird das aber nicht benötigt. Du kannst das erzwingen, indem du auf der Kommandozeile /bin/bash ausführst - wir wollen die jetzt schon komplizierte Geschichte aber nicht unnötigen verkomplizieren. ;)
Die Bash aufhübschen
Nach der langweiligen aber notwendige Theorie, gibts jetzt ein paar Zeilen Code, mit denen die Kommandozeile gleich viel besser aussieht. Ich hab aus oben genannten Gründen das Ganze in die Datei ~/.profile gepackt. Zunächst einmal ein paar Aliase um die Verzeichnislisten etwas übersichtlicher zu gestalten oder auch das oft benutzte cd (change dir) zu vereinfachen.
1alias l='ls -alCFGA'
2alias ll="ls -CFGla"
3alias h="history"
4alias .="cd ~"
5alias ..="cd .."
6alias ...="cd ../.."
7# -p: erzeuge Unterverzeichnis, falls sie nicht existieren
8# -v: gebe erzeugtes Verzeichnis zurück
9alias mkdir="mkdir -pv"
10# grep Ausgabe farbig gestalten
11alias grep='grep --color=auto'
12alias fgrep='fgrep --color=auto'
13alias egrep='egrep --color=auto'
14# das aktuelle Verzeichnis im Finder öffnen
15alias f='open -a Finder ./'
Die folgende Zeile ist kein Alias sondern eine Funktion. Damit wird ein Verzeichnis (mit allen benötigten Unterverzeichnissen erstellt) und dann mit cd direkt in das Verzeichnis gewechselt:
1mcd () { mkdir -p "$1" && cd "$1"; }
Als nächstes will ich die Darstellung der zuletzt benutzten Befehle (history bzw. jetzt h) etwas anpassen:
1# Duplikate ignorieren
2HISTCONTROL=ignoreboth
3# Befehle anhängen und die Historie nicht jedes mal neu überschreiben
4shopt -s histappend
5# die maximale Größe bzw. Länge der Historie erhöhen
6HISTSIZE=1000
7HISTFILESIZE=2000
Der folgende Befehl sorgt dafür, dass sich die Anzahl der dargestellten Spalten und Zeilen an die Fenstergröße anpasst. Die Funktion sollte per default aktiviert sein, zur Sicherheit legen wir das hier trotzdem fest! Mit dem Parameter -u kann die Option übrigens wieder deaktiviert werden.
1shopt -s checkwinsize
Hiermit wird das Aussehen und die Farbe der Kommandozeile geändert. Ich hab mich für eine relativ bunte Variante entschieden. Die Einstellung für den sog. Prompt wird in der globalen Variable PS1 (prompt statement 1) gespeichert. Die folgenden Parameter sind hier geläufig:
- \u - Benutzername
- \h - Name des Hosts / Computers
- \w - der komplette aktuelle Pfad
- \n - Ein Zeilenumbruch
Mit PS2, PS3, PS4 lassen sich noch andere Prompts konfigurieren, wie z.B. der für interaktive Eingaben in Bash-Scripten. Die Variable PROMPT_COMMAND wird sogar noch vor PS1 dargestellt. Wer mehr dazu erfahren möchte, schaut einfach mal dort vorbei.
1export PS1="$(date +%k:%m:%S) \[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "
2
3# Diese Konstanten steuern die Farben für die Ausgabe von cd.
4export CLICOLOR=1
5export LSCOLORS=ExFxBxDxCxegedabagacad
Das ganze sieht dann so aus:
Eine bunte aber informative Kommandozeile
Diese Funktion zeigt alle Prozesse, die unter dem aktuellen Benutzer aktiv sind:
1me() { ps $@ -u $USER -o pid,%cpu,%mem,start,time,bsdtime,command ; }
Als nächstes ein paar Aliase um das Netzwerk ein bisschen einfacher im Griff zu behalten:
1# alle Verbindungen, die gerade "Lauschen"
2alias cons='sudo lsof -i | grep LISTEN'
3# alle offenen Sockets
4alias socks='sudo /usr/sbin/lsof -i -P'
5# alle offenen TCP/IP-Sockets
6alias tsocks='lsof -i'
7# alle offenen UDP-Sockets
8alias usocks='sudo /usr/sbin/lsof -nP | grep UDP'
9# alle offenen TCP-Sockets
10alias lsocks='sudo /usr/sbin/lsof -nP | grep TCP'
11# grundlegende Netzwerkeinstellungen
12alias net='ipconfig getpacket en0'
13
14# den DNS-Cache leeren
15alias cleardns='dscacheutil -flushcache'
Die ganzen Inhalte gibt es hier noch einmal in kompakter Version:
1case $- in
2 *i*) ;;
3 *) return;;
4esac
5
6alias l='ls -alCFGA'
7alias ll="ls -CFGla"
8alias h="history"
9alias .="cd ~"
10alias ..="cd ..; pwd"
11alias ...="cd ../..; pwd"
12alias mkdir="mkdir -pv"
13alias grep='grep --color=auto'
14alias fgrep='fgrep --color=auto'
15alias egrep='egrep --color=auto'
16alias f='open -a Finder ./'
17
18HISTCONTROL=ignoreboth
19shopt -s histappend
20HISTSIZE=1000
21HISTFILESIZE=2000
22
23shopt -s checkwinsize
24
25case "$TERM" in
26 xterm-color|*-256color) color_prompt=yes;;
27esac
28
29export PS1="$(date +%k:%m:%S) \[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "
30export CLICOLOR=1
31export LSCOLORS=ExFxBxDxCxegedabagacad
32
33mcd () { mkdir -p "$1" && cd "$1"; }
34me() { ps $@ -u $USER -o pid,%cpu,%mem,start,time,bsdtime,command ; }
35
36alias cons='sudo lsof -i | grep LISTEN'
37alias socks='sudo /usr/sbin/lsof -i -P'
38alias tsocks='lsof -i'
39alias usocks='sudo /usr/sbin/lsof -nP | grep UDP'
40alias lsocks='sudo /usr/sbin/lsof -nP | grep TCP'
41alias net='ipconfig getpacket en0'
42alias cleardns='dscacheutil -flushcache'
Zusammenfassung
Eine Anleitung zur Anpassung der Bash-Shell auf macOS. Der Artikel erklärt die Hierarchie der Konfigurationsdateien und bietet eine Sammlung von praktischen Code-Snippets zur Optimierung des Workflows, inklusive Aliases für häufige Befehle, farblicher Gestaltung des Prompts und nützlicher Netzwerk-Tools.
Hauptthemen: macOS Bash Shell-Scripting Kommandozeile System-Konfiguration
Schwierigkeitsgrad: intermediate
Lesezeit: ca. 5 Minuten