CLI-Adventskalender, Tag 6: bash

CLI-Adventskalender: bash

Avatar von Eric

An diesem schönen Nikolaustag beschäftigen wir uns endlich einmal mit bash. Wurde ja auch Zeit. Und wie in jedem Adventskalender gibt es auch in unserem Kommandozeilen-Adventskalender heute ein größeres Schokolade.

Bisher haben wir alle diese hübschen Befehle in unser Terminal eingegeben und – vielleicht – noch gar nicht darüber nachgedacht, wer sie entgegen nimmt. Unsere Shell. Ganz gleich ob ihr tatsächlich bash, zsh, ksh, csh, tcsh, ash, dash oder fish einsetzt, die Features von heute gibt es in den meisten von ihnen.

Bash

Die Welt läuft auf bash. Oder auf Excel. Es kommt ganz darauf an, wie dicht an der Maschine wir uns bewegen. Die Tatsache, dass unsere mächtigen kleinen Unix-Befehle viele Probleme schmerzfrei lösen können, hat dazu geführt, dass es super viele kleine Skripte gibt, die all die Aufgaben übernehmen, die um unsere hochmodernen Applikationen herum anfallen.

Wir schreiben Geschichte!

Oder noch besser: Bash schreibt die Geschichte für uns! Diese wunderschöne Abkürzung, dass man mit Pfeil nach oben alte Befehle wiederbekommt und man sie nicht neu tippen muss? Die kann noch so viel mehr.

STRG + R – ich hatte doch mal ein Kommando eingetippt das war irgendwie sowas mit „scan“ … und wie hießen die Flags? Ach ja! Da haben wir es ja.

Bash hat da auch eine Reihe von nützlichen Variablen, die sie automatisch für uns befüllt.

sudo !! – führe den letzten Befehl nochmal als root aus.

Auch nützlich:

sudo chown eric !*

Nehme die Parameter des letzten Befehls und füttere sie in diesen Befehl (in diesem Fall, weil ich nicht genügend Rechte auf dieser Datei hatte).

Natürlich kann man mit history ganz einfach die komplette Historie anschauen. Die Befehle kann man dann mit ihrer Zeilennummer, z. B. !42 direkt ausführen.

Man kann natürlich auch gleich an $HOME/.bash_history herumdoktoren. Und wo wir gerade dabei sind: Bitte jedes Kommando nur einmal logggen.

export HISTCONTROL=ignoredups

Und überhaupt, wie wäre es, wenn bestimmte Kommandos gar nicht auftauchen? Auch super für Leute, die Passwörter in Klartext per Parameter mitgeben.

export HISTIGNORE="&:ls:[bf]g:exit:history"


Wer stattdessen ganz genau wissen will, was wann eingegeben wurde, bekommt mit

export HISTTIMEFORMAT='%F %T'

supernette Zeitstempel vorne dran, die den inneren Monk zufriedenstellen.

WICHTIG: Damit diese Einstellungen erhalten bleiben, tragt sie bitte unbedingt in eurer .bashrc in eurem home-Verzeichnis ein.

Du weißt doch, was ich meine!

Autovervollständigung. Einfach zwei Buchstaben eintippen, Tab drücken und bash macht den Rest alleine. Das ist tatsächlich ein komplexeres Thema.

Der einfachste Weg ist mit Sicherheit das bash-completion-Projekt, dass bei den gängigsten Distros bereits mit dabei ist.

sudo apt install bash-completion
sudo pacman -S bash-completion
sudo dnf install bash-completion

Oft liefern Tools auch ihre eigenen Funktionen mit. Git kommt zum Beispiel mit einer eigenen Vervollständigung, das bei der Git-Installation mit rausfällt.

curl -o ~/.git-completion.bash https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
~/.git-completion.bash

In der .inputrc lassen sich ein paar Optionen setzen:

set completion-ignore-case on
set show-all-if-ambiguous on

… und über den complete-Befehl lassen sich alle Regeln einsehen und abändern, wenn man es wirklich, wirklich ernst meint.

Ich weiß doch, was ich meine!

Man kann sich natürlich wundervolle Shortcuts setzen, die einem den Arbeitsalltag erleichtern.

alias gst="git status"

Oder Sachen hübscher machen.

alias ls="ls -la"

Loswerden kann man sie mit

unalias ls

… und umgehen kann man sie mit

command ls

Das kann sehr nützlich sein, wenn man sich vertippt und den Zugang zu wichtigen Tools verbaut hat.

Es muss auch nach was aussehen

Der Bashprompt wird definiert über die PS1-Variable.

PS1='[\u]-[$(ip route get 1.1.1.1 | awk -F"src " '"'"'NR == 1{ split($2, a," ");print a[1]}'"'"')]-[\d]-[\t]\n\$ '

gibt mir

[eric]-[192.168.0.23]-[Sat Nov 04]-[10:36:27]
$ 

Das ganze kann auch sehr nützlich sein, um schnell Konsolen-Output mit Zeitstempel und IP zu dokumentieren.

Wer keine Lust hat sich einen String selber zu bauen (die Optionen befinden sich in der bash man page im Abschnit „PROMPTING“), kann sich auch über Onlinetools selbst einen zusammen klicken.

Als nächstes möchten wir vielleicht ein bißchen ansprechendere Farben und Fonts. Das geht am besten über den Terminal-Emulator. Ein besonderes Augenmerk sollte hier den Nerdfonts gewidmet werden, die Symbole für alle erdenklichen Kontexte liefern (Git-Symbol wenn man gerade in einem Repo ist, stilisiertes X wenn man unstaged changes hat, etc). Wer keine Lust hat sich selbst damit zu beschäftigen, bekommt mit Powerline einen bunten, Icon-besetzten Prompt direkt aus der Tüte.

Bash an sich verlässt sich auf PS1 und die LS_COLORS:

PS1='\[\e[31m\][\u]\[\e[0m\]-\[\e[33m\][$(ip route get 1.1.1.1 | awk -F"src " '"'"'NR == 1{ split($2, a," ");print a[1]}'"'"')]\[\e[0m\]-\[\e[32m\][\d]\[\e[0m\]-\[\e[34m\][\t]\[\e[0m\]\n\[\e[35m\]\$ \[\e[0m\]'
LS_COLORS='di=34:fi=0:ln=35'

Aber eine bessere Anlaufstelle ist die .Xresources-Datei, die von eurem Terminal-Emulator wahrscheinlich respektiert wird (auch wenn die jeweilige Konfiguration eures Terminal-Emulators wahrscheinlich mehr Freiheit bietet und besser funktioniert).

*background: #24273A
*foreground: #CAD3F5

! black
*color0: #494D64
*color8: #5B6078

! red
*color1: #ED8796
*color9: #ED8796

! green
*color2: #A6DA95
*color10: #A6DA95

! yellow
*color3: #EED49F
*color11: #EED49F

! blue
*color4: #8AADF4
*color12: #8AADF4

! magenta
*color5: #F5BDE6
*color13: #F5BDE6

! cyan
*color6: #8BD5CA
*color14: #8BD5CA

! white
*color7: #B8C0E0
*color15: #A5ADCB

Das ist die Macchiato-Variation von Catppuccin. Die Farben sind die altbekannten Hexcodes.

Aber bei ohmyzsh fällt das doch alles aus der Tüte!

Manchmal möchte man einfach nur schnell auf ein funktionierendes Setup kommen. Was für die zsh ohmyzsh ist, ist für bash bash-it.

git clone --depth=1 https://github.com/Bash-it/bash-it.git ~/.bash_it
~/.bash-it/install.sh

bash-it bietet Autovervollständigung, eine ganze Reihe an Themes (export BASH_IT_THEME="powerline-multiline"), Aliases, Funktionen, sowie ein Community-getriebenes Plugin-System mit Plugins für alle gängigen Tools.

Skripte

Bash ist seine eigene Programmiersprache mit einigen ungewöhnlichen Eigenheiten. Variablenzuweisungen funktionieren nur wenn man keine Leerzeichen setzt, also zum Beispiel index=1.

Und es gilt zu beachten, dass $ für Substitutionen ist, die auch innerhalb von Double-Quotes funktioniert, nicht aber bei Single-Quotes.

echo "$index" # 1
echo '$index' # $index

Es gibt altbekannte Kontrollstrukturen

if [[ $index -lt 5 ]]
then
    echo "Weniger als 5"
else
    echo "Mehr als 4"
fi

und Loops, z.B.

for i in $(seq 1 10); do
    echo "Number $i"
done

… auch wenn sie für moderne Augen etwas merkwürdig aussehen.

Der Selling Point hier ist die direkte Integration mit Konsolenbefehlen. Alles, was ich in einem Prompt eingeben kann, sind automatisch Skriptbefehle, wenn ich sie in einer Textdatei speichere – und umgekehrt! Die eckigen Klammern hinter if sind beispielsweise nur syntaktischer Zucker für den Testbefehl.

if test $index -lt 7
then
...

Besonders nützlich ist hier der Test ob Dateien existieren.

if [[! -f "/var/log/logdatei.log" ]]
then
    touch "/var/log/logdatei.log"
fi

Wer sich tiefer einarbeiten möchte, findet alles wissenswerte im altbackenen Advanced Bash-Scripting Guide.

Das beste aber zum Schluss: set -x – das ganz oben im Skript gibt beim Ausführen die einzelnen Zeilen aus, die ausgeführt werden. Super wertvoll fürs Debuggen!

Shell-Weisheit des Tages
Terminals sind sexy!

Die TV-Serie hat einen Cybertwist genommen! Die Ermittler treten die Tür der Hackerhöhle ein. Eine Gestalt mit Hoodie hebt langsam und dramatisch die Hände, den Rücken immer noch der Polizei zugewendet, vor ihr sind acht Bildschirme auf denen bunter Text entlang scrollt. Keiner der Bildschirme zeigt irgendeine Form von Startmenü …

Ästhetik ist wichtig.

Nein ernsthaft, schaut mal auf das unixporn Subreddit. Keine Sorge, komplett safe for work.

Wenn der böse Hacker anfängt in irgendwelchen Windows-GUIs herumzuklicken, sieht er ungefähr so gefährlich aus wie Bob der Buchhalter am Montagmorgen vor seiner ersten Tasse Kaffee (Nichts für ungut, Bob!).

Terminals sehen einfach toll aus. Leute die Sachen in Terminals tippen, sehen für Laienaugen gleich so aus, als ob sie viel von Computern verstehen. Leute deren Terminalprompts ästhetisch eingefärbt sind, sehen für Nerdaugen so aus wie Leute, die viel von Computern verstehen. Außerdem sind die richtigen Farbschemata so viel angenehmer für die Augen.

Manche Leute werden die Augen rollen wenn ich das sage, aber ein selbst angepasstes Terminal, mit selbst bestimmten Prompt und selbst ausgesuchten Farben liefert mehr als alles andere das Gefühl, auf der eigenen Maschine zuhause zu sein. Meine Konsole, ist meine Konsole. Sie auch so aussehen zu lassen war definitiv ein wichtiger Meilenstein für mich.

Avatar von Eric

Kommentare

2 Antworten zu „CLI-Adventskalender: bash“

  1. Zum Nikolaustag mal ein Dankeschön für diesen Adventskalender. Sehr unterhaltsam geschrieben und macht mir jeden Tag Freude! :)

    1. Avatar von Tom Wießeckel
      Tom Wießeckel

      Freut uns, dass es dir gefällt! Auf die nächsten 18 Teile :D

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.