Eine kleine Sammlung an bash-Kniffen, Tricks und HowTos.

Diese Unterseite ist bisher ohne durchdachte Sortierung. Werde für Interessierte das Neueste immer oben anfügen.

Boot-Stick erstellen

1sudo dd bs=4M if=/path/to/manjaro.iso of=/dev/sd[drive letter] status=progress oflag=sync

Dateien anlegen via Allokierung

1fallocate -l 10GB meine_grosse_datei

ggf. Parameter -o offset und -n beachten, bei Größenänderung swap-File.

Passwort generieren

1tr -dc A-Za-z0-9 </dev/urandom | head -c 64

Als kleine Script-Version in meinem GitLab-Repository

Datumsberechnungen

Übermorgen

1date  --date="2 days" +"%d.%m.%Y"

Vorgestern

1date  --date="2 days ago" +"%d.%m.%Y"

Ausgabe von “du”

1du -sk * | sort -n
1du -sb * | sort -n | numfmt --to=iec

Etwas mehr Erklärung hier im Blog-Artikel.

Binary installiert ?

1if ! type "docker-compose" > /dev/null; then
2    echo 'Error: docker-compose is not installed.' >&2
3    show_error_function
4    exit 1
5fi

Eingaben

1read -rp "Hier eine Entscheidungsfrage (j/n): " VARIABLE_WO_DER_INHALT_REIN_SOLL

tabellarische Umformartierung

1echo "a11 b12_Text c13" > /tmp/beispiel
2echo "a21 b22 c23" >> /tmp/beispiel
3column -t /tmp/beispiel

Ausgabe:

a11  b12_Text  c13
a21  b22       c23

Alias

1alias sdf='df -h|egrep -v '\''^(overlay|nsfs|shm|cgroup|tmpfs|debugfs|mqueue)'\'''
2alias smount='mount|egrep -v '\''^(overlay|nsfs|shm|cgroup|tmpfs|debugfs|mqueue)'\'''
3alias dc='docker-compose'
4de() { docker exec -it "$1" bash; }
5alias dpa='docker ps -f status=exited'
6psg() { ps aux | grep "$1" | grep -v grep; }
7alias t='ls -lrt --color=auto'

Prompting

1PS1="[\u@\H:\w]\$ "

Ggf \n einstreuen für extra Zeile.

Verzeichniswechsel

Mal wieder beim Verzeichniswechsel vertippt?

Die bash speichert das letzte Verzeichnis, in welchem man sich befunden hat in der Variable $OLDPWD.

Ein

1cd $OLDPWD

bringt einen also wieder zurück ins alte Verzeichnis.

Kürzer wird es mit:

1cd -

aktuelles Verzeichnis

Das aktuelle Verzeichnis kann man sich mit pwd ausgeben lassen.

1pwd
1erde:~$ cd /etc
2erde:/etc$ cd /var
3erde:/var$ cd -
4/etc
5erde:/etc$ cd $OLDPWD
6erde:/var$

Schreiben auf STDERR

1echo "Dieser Text erscheint auf STDERR" >&2

Fehlermeldungen umleiten

in Log-Datei

1./foo.sh bar/* >foo-bar.log  2>&1

wegwerfen

1./foo.sh > /dev/null 2>&1

Backup einer Datei

1cp -p foo{,.bak}

ist dasselbe wie

1cp -p foo foo.bak

Spezial-Variablen

Es gibt ein paar Spezialvariablen in der bash, die einem das Tippen ersparen.

Umgebungsvariablen

Name Erklärung
$$ Prozess-ID (PID) des laufenden Programms
$? Rückgabewert des letzten Befehls

in Scripten

$* Alle dem Programm übergebenen Parameter, durch Leerzeichen getrennt.

1$*=$1 $2 $3 $4 ...

"$*" Alle dem Programm übergebenen Parameter in Anführungszeichen, durch das 1. Zeichen der Variablen $IFS getrennt.

1"$*"="$1c$2c$3c$4"...

$@ Alle dem Programm übergebenen Parameter, durch Leerzeichen getrennt.

1$@=$1 $2 $3 $4

"$@" Alle dem Programm übergebenen Parameter, einzeln in Anführungszeichen eingeschlossen und durch Leerzeichen getrennt.

1"$@"="$1" "$2" "$3" "$4" ...

$# Anzahl der übergebenen Parameter

Historie

!$ letzter Parameter des vorhergehenden Befehls

1$ ls -l foo
2$ echo !$
3echo foo
4foo

!! letzter Befehl inkl. aller Parameter

Mal wieder sudo vergessen? Kein Problem:

1$ ein script
2$ sudo !!
kurz lang
history 10 history | tail
cd !$:h cd !!:$:h

Beispiel

1$ ls -l /etc/apt/apt.conf.d/20auto-upgrades 
2$ cd !$:h
3cd /etc/apt/apt.conf.d

Eselsbrücke: RegEx-like

Eingabe Funktion
!?abc das erste Kommando in der History suchen, das abc enthält
!abc das erste Kommando in der History suchen, das mit abc beginnt
!! zuletzt aufgerufener Befehl
!^ erster Parameter im vorherigen Befehl
!* alle Parameter im vorherigen Befehl
!$ letzter Parameter im vorherigen Befehl
!n Befehl an Position n in der History
!-n Befehl, der an der n-ten Stelle von hinten in der History steht :2
:2 Nur der zweite Parameter des Befehls
:2-5 der zweite bis fünfte Parameter des Befehls
:2-$ der zweite und alle weiteren Parameter des Befehls
:* Sämtliche Parameter des Befehls
:q den Text in Anführungsstriche setzen
:p "print" den Befehl nur ausgeben
:h dirname in einer Pfadangabe das Ende abschneiden /etc/apt/apt.conf.d
:t basename das Ende einer Pfadangabe (zum Beispiel der Dateiname) 20auto-upgrades
ls -l /foo/bar.baz
:r remove alles hinter dem letzten Punkt abschneiden (zum Beispiel die Dateiendung) /foo/bar
:e Endung alles hinter dem letzten Punkt (zum Beispiel die Dateiendung) = baz

Beispiel Befehlssuche

1$ echo foo bar baz
2foo bar baz
3$ echo !echo:2
4echo bar
5bar

Nur ausgeben:

1$ echo foo bar baz
2foo bar baz
3$ echo !echo:2:p
4echo bar

schnell in bash mal würfeln:

1let z=$RANDOM%6
Datum Änderung
03.11.2023 Passwort generieren
14.02.2024 Hinweis auf gen_passwort.sh im GitLab-Repository
11.09.2024 fallocate
22.09.2024 Bootstick
13.11.2024 Fix Typo