- Eine Übersicht, wie sich mit verschiedenen Tastenkürzeln und Befehlskombinationen Tempo und Effizienz bei der Arbeit in der Shell steigern lassen
- Mit grundlegenden Kürzeln wie CTRL + W, U, K, Y lässt sich die Zeile bearbeiten, mit CTRL + A/E, ALT + B/F der Cursor bewegen, und mit reset kann das Terminal wiederhergestellt werden
- In Bash und Zsh ermöglicht CTRL + R die Suche im Befehlsverlauf, mit !! · !$ · ESC+. lassen sich frühere Befehle wiederverwenden, und mit Brace Expansion sowie Globstar können wiederkehrende Aufgaben automatisiert werden
- Mit fortgeschrittenen Funktionen wie Process Substitution, tee und bg/disown lassen sich Prozesssteuerung und Log-Verwaltung effizienter gestalten
- Wenn man die Shell wie einen Werkzeugkasten sicher beherrscht, steigen Produktivität und Fokus; entscheidend ist, sich die Kürzel nach und nach anzugewöhnen
Grundlegende Tastenkürzel und Funktionen, die in fast jeder Shell funktionieren
-
Die Kombinationen CTRL + W, U, K, Y** sind Zeilenbearbeitungs-Kürzel, mit denen sich Wörter oder die Teile einer Zeile vor bzw. hinter dem Cursor schnell löschen oder wiederherstellen**
CTRL + W löscht das Wort vor dem Cursor
CTRL + U schneidet vom Cursor bis zum Zeilenanfang aus; mit CTRL + Y kann es wieder eingefügt werden
CTRL + K schneidet vom Cursor bis zum Zeilenende aus
- CTRL + A / E springt an den Anfang bzw. das Ende der Zeile, ALT + B / F bewegt sich wortweise vor und zurück
- In den meisten Terminals ist das standardmäßig aktiviert; auf dem Mac muss die Option-Taste als Meta konfiguriert werden
- Mit den Befehlen reset oder stty sane lässt sich ein beschädigtes Terminal wiederherstellen, wenn versehentlich eine Binärdatei ausgegeben wurde
- Auch wenn die Anzeige kaputt ist, sind Eingaben weiterhin möglich; zur Wiederherstellung einfach
reset eingeben und Enter drücken
- CTRL + C / D dienen zum Abbrechen eines Befehls bzw. zum Senden eines EOF-Signals (Dateiende)
- Wird
CTRL + D an einer leeren Eingabeaufforderung gedrückt, wird die Shell beendet
- CTRL + L entspricht dem Befehl
clear und räumt den Bildschirm sofort auf
- Die aktuell eingegebene Befehlszeile bleibt dabei erhalten, während die Eingabeaufforderung an den oberen Bildschirmrand verschoben wird
- cd - wechselt sofort in das vorherige Verzeichnis, mit pushd / popd kann man über einen Verzeichnis-Stack zwischen mehreren Orten wechseln
- > file.txt leert eine Datei, ohne sie zu löschen, sodass Berechtigungen und Eigentümer erhalten bleiben
- Die Variable $_ verwendet das letzte Argument des vorherigen Befehls erneut
- Beispiel:
mkdir -p /path/newdir && cd "$_"
- set -e und set -u sind Optionen, die die Sicherheit von Skripten erhöhen
set -e beendet das Skript sofort bei einem Fehler
set -u behandelt Verweise auf nicht definierte Variablen als Fehler
- Die Kombination
set -euo pipefail bietet einen noch stärkeren Schutz
Fortgeschrittene Tastenkürzel und Funktionen in Bash und Zsh
- CTRL + R führt eine inkrementelle Rückwärtssuche im Befehlsverlauf aus
- Durch Eingabe eines Schlüsselworts lassen sich frühere Befehle sofort finden und erneut verwenden
- !! führt den gesamten vorherigen Befehl erneut aus
- Mit
sudo !! kann der zuletzt ausgeführte Befehl mit Administratorrechten erneut gestartet werden
- CTRL + X, CTRL + E öffnet den aktuell eingegebenen Befehl im Standardeditor (Vim, Nano usw.) zur Bearbeitung und führt ihn danach aus
- In Zsh ist dafür eine separate Konfiguration nötig
- Der Befehl fc ist die klassische Methode, einen früheren Befehl in
$EDITOR zu öffnen und zu bearbeiten
- ESC + . oder ALT + . fügt das letzte Argument des unmittelbar vorherigen Befehls an der Cursorposition ein
- Bei wiederholter Eingabe wird zyklisch auch durch die Argumente noch älterer Befehle gewechselt
- !$ bietet dieselbe Funktion in nicht-interaktiver Form
-
Brace Expansion** ist eine geschweifte-Klammern-Erweiterung, die wiederholte Eingaben reduziert**
cp pf.conf{,.bak} → cp pf.conf pf.conf.bak
mv filename.{txt,md} → mv filename.txt filename.md
- Mit
mkdir -p project/{src,tests,docs} lassen sich mehrere Verzeichnisse auf einmal anlegen
- Process Substitution
<(command) behandelt die Ausgabe eines Befehls wie eine Datei
- Beispiel:
diff <(sort file1.txt) <(sort file2.txt) vergleicht ohne temporäre Dateien
- Globstar(
**) durchsucht Dateien rekursiv bis in Unterverzeichnisse
- In Bash wird es mit
shopt -s globstar aktiviert, in Zsh ist es standardmäßig aktiv
- Beispiel:
ls **/*.js findet JS-Dateien in allen Unterordnern
-
Die Kombination aus CTRL + Z**,** bg**,** disown** lässt Prozesse** im Hintergrund weiterlaufen und von der Shell lösen
- Mit
CTRL + Z anhalten → mit bg im Hintergrund fortsetzen → mit disown von der Shell lösen
- So kann ein Prozess auch nach dem Beenden einer SSH-Sitzung weiterlaufen
- command |& tee file.log leitet Standardausgabe (stdout) und Standardfehler (stderr) gleichzeitig in eine Pipe
|& ist die Kurzform von 2>&1 |
- Mit
tee lässt sich die Ausgabe gleichzeitig auf dem Bildschirm anzeigen und in einem Log speichern
Zentrale Hinweise für den Umgang mit der Shell
- Die Shell ist ein Werkzeugkasten; wer sicher mit ihr umgeht, kann seine Produktivität deutlich steigern
- Es ist effektiver, sich nicht alle Kürzel auf einmal einzuprägen, sondern sie sich nach und nach anzugewöhnen
- Durch weniger wiederholte Eingaben und unnötiges Tippen lässt sich der Arbeitsfluss vereinfachen
- Mit zunehmender Vertrautheit wird das Terminal nicht mehr zum Hindernis, sondern zum eigenen Arbeitsraum
3 Kommentare
Fast alles sind Emacs-Keybindings, aber von Emacs selbst ist kaum die Rede, und wenn man sieht, wie so etwas heutzutage oft wie ein Tipp geteilt wird, merkt man, wie sehr sich die Zeiten geändert haben. Die
readline-Bibliothek implementiert ja durchweg Emacs-Keybindings. Es fühlt sich an, als wäre der Umstieg auf IDEs schon fast 20 Jahre her, aber aus der Sicht eines Fossils, das noch Dinge wiegdbtuibenutzt hat, denke ich trotzdem: Wirklich Gutes stirbt nicht.Hacker-News-Kommentare
Für mich war der Moment, in dem sich alles verändert hat, der, als ich die Pfeil-nach-oben-Taste umbelegt habe
Jetzt gehe ich nicht mehr durch alle Befehle, sondern suche nur noch nach Befehlen, die mit den bereits eingegebenen Zeichen beginnen
Wenn ich zum Beispiel
tar -eingebe und dann Pfeil nach oben drücke, erscheinen sofort die zuvor verwendeten tar-OptionenIn zsh richte ich das so ein
.inputrchinzu.inputrcumsetzenWenn man im Terminal den vim-mode einschaltet, wird alles deutlich angenehmer
Ein Fehler drei Wörter weiter vorne?
3bcwund erledigtAlles löschen mit
cc, komplexere Änderungen mitv, um direkt in (neo)vim zu öffnenWenn man ohnehin schon (neo)vim verwendet, ist es ideal, weil man keine neuen Tastenkürzel lernen muss
ctrl-x+ein neovim; das ist ein guter Kompromissset -o vieinIch fand beeindruckend, dass jemand ein Skript namens
\#in den PATH gelegt hat, um Teile einer Pipeline auszukommentieren~/bin/noglobhabe ich stehen, um beim Aufruf von zsh-Skripten aus bash noglob-Konflikte zu vermeidenmycmd1 #| mycmd2hat$PATHaufnehmenCTRL+W löscht normalerweise bis zum vorherigen Leerzeichen und entfernt damit
/var/log/nginx/komplettAlt+Backspace löscht bis zum vorherigen nichtalphabetischen Zeichen
Man muss allerdings aufpassen, weil es sich mit dem Tastenkürzel zum Schließen von Browser-Tabs überschneidet
/aus der Einstellung$WORDCHARSentfernt, bekommt man das gewünschte Verhalten (Referenzlink)Ich empfehle, die History-Suche mit der fzf-Shell-Integration aufzurüsten
Demo-Video / offizielle Dokumentation
Ich habe noch einen Trick, den ich oft benutze
Wenn ich gerade einen langen Befehl tippe, aber zuerst etwas anderes erledigen muss, breche ich nicht mit
Ctrl-Cab, sondern kommentiere ihn aus und führe ihn aus, damit er in der History bleibt"push-line-or-edit", und in bash lässt sich etwas Ähnliches mitC-uund anschließendC-yumsetzenctrl-udie aktuelle Zeile zu speichern und zu leeren und sie dann mitctrl-ywieder einzufügen. In zsh kannalt-qdiesen Ablauf automatisierenalt-shift-3vor den aktuellen Befehl ein#setzen und in eine neue Zeile wechselnDer LLM-artige Titel gefällt mir nicht, aber einige Tipps sind nützlich und ich werde sie ausprobieren
Schade, dass Brace Expansion nicht gut mit Tab-Vervollständigung zusammenspielt. Es wäre schön, wenn es mehr Funktionen wie das Duplizieren des letzten Tokens oder das Entfernen einer Dateiendung gäbe
In meiner zsh-Konfiguration verwende ich eine Funktion, um bestimmte Befehle aus der History auszuschließen
So bleiben zum Beispiel riskante Befehle wie
--forcenicht in der History stehenIn zsh verwende ich ein Snippet für die automatische Erweiterung globaler Aliase
Zum Beispiel führt
alias -G G='rg -s'dazu, dasscommand | Gautomatisch zucommand | rg -serweitert wirdBei Eingabe eines Leerzeichens wird automatisch erweitert, und mit
\aliaskann man die Erweiterung überspringenIch habe eine „deep cd“-Funktion in meiner
.bashrcSie wechselt automatisch in das erste Verzeichnis, das die als Argument übergebene Zeichenkette enthält
Ich dachte erst, sie wäre langsam, aber am Ende benutze ich sie überraschend oft
jc, z oder fzf anzuschauenDas Remapping der Pfeiltaste nach oben macht man als Emacs-Nutzer einfach mit
c-r. Am Ende des Tunings steht die Standardeinstellung.