72 Punkte von GN⁺ 2026-03-27 | 3 Kommentare | Auf WhatsApp teilen
  • Eine Übersicht, wie sich mit verschiedenen Tastenkürzeln und Befehls­kombinationen 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

 
phoon 2026-03-30

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 wie gdbtui benutzt hat, denke ich trotzdem: Wirklich Gutes stirbt nicht.

 
GN⁺ 2026-03-27
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-Optionen
    In zsh richte ich das so ein

    bindkey "^[OA" up-line-or-beginning-search # Up  
    bindkey "^[OB" down-line-or-beginning-search # Down
    
    • Sobald man anfängt, CTRL+r zu benutzen, verwendet man die Pfeil-nach-oben-Taste nie wieder
    • Ich halte das für einen echten Game Changer. Für etwas Ähnliches in bash fügt man Folgendes zu .inputrc hinzu
      "\e[A":history-search-backward  
      "\e[B":history-search-forward
      
    • In der fish shell ist das Standardverhalten. Mit Pfeil hoch/runter durchsucht man Befehle anhand des eingegebenen Worts, und mit Alt+hoch/runter kann man sogar nur Argumente durchsuchen
    • Das lässt sich auch direkt in .inputrc umsetzen
    • Ich lasse Pfeil hoch/runter unverändert und richte stattdessen ctrl+p und ctrl+n auf diese Weise ein
  • Wenn man im Terminal den vim-mode einschaltet, wird alles deutlich angenehmer
    Ein Fehler drei Wörter weiter vorne? 3bcw und erledigt
    Alles löschen mit cc, komplexere Änderungen mit v, um direkt in (neo)vim zu öffnen
    Wenn man ohnehin schon (neo)vim verwendet, ist es ideal, weil man keine neuen Tastenkürzel lernen muss

    • Das erinnert mich an eine Stelle aus einem alten Emacs-Handbuch. Statt komplexer Befehle würde ich eher Maus-Einstellungen empfehlen
    • Ich nutze seit über 20 Jahren (n)vim, aber vi-mode in der Shell mag ich nicht. Wenn ich komplexe Befehle brauche, öffne ich sie mit ctrl-x+e in neovim; das ist ein guter Kompromiss
    • Ich benutze vim auch oft, aber nicht in der Shell. Stattdessen verwende ich Emacs-artige Tastenkürzel (ctrl-a, ctrl-e usw.) systemweit unter macOS. Ich wünschte, vim würde im Insert-Modus Emacs-Bindings unterstützen
    • Den Funktionsnamen „readline vi-mode“ höre ich zum ersten Mal. Muss ich mir näher anschauen
    • Ich verstehe nicht, warum emacs mode der Standard ist. Wenn ich eine neue Shell öffne, tippe ich als Erstes set -o vi ein
  • Ich fand beeindruckend, dass jemand ein Skript namens \# in den PATH gelegt hat, um Teile einer Pipeline auszukommentieren

    #!/bin/sh
    cat
    
    • Ich nutze einen ähnlichen Trick. In ~/bin/noglob habe ich
      #!/bin/sh
      $*
      
      stehen, um beim Aufruf von zsh-Skripten aus bash noglob-Konflikte zu vermeiden
    • Ich verwende Klammer-Kommentare. Für die Dokumentation von Skripten ist das gut, aber in der interaktiven Shell umständlich. Trotzdem eine kreative Art zu kommentieren
    • Ich frage mich, welchen Vorteil das gegenüber mycmd1 #| mycmd2 hat
    • Das ist wirklich nützlich, ich werde es in mein $PATH aufnehmen
  • CTRL+W löscht normalerweise bis zum vorherigen Leerzeichen und entfernt damit /var/log/nginx/ komplett
    Alt+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

    • Ab Firefox v147 gibt es eine Funktion zum Neubelegen von Tastenkürzeln. Passender Link
    • Unter macOS sind GUI-Tastenkürzel und Terminal-Tastenkürzel getrennt, daher gibt es dieses Problem nicht. ⌘C, ⌘W usw. funktionieren auch im Terminal genauso
    • In meiner Umgebung (fish + Alacritty) ist es umgekehrt. Zum Glück kann man mit Ctrl-Shift-T geschlossene Tabs wiederherstellen
    • Wenn man / aus der Einstellung $WORDCHARS entfernt, bekommt man das gewünschte Verhalten (Referenzlink)
    • Mit Ctrl-Shift-T kann man den Tab sofort wiederherstellen
  • 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-C ab, sondern kommentiere ihn aus und führe ihn aus, damit er in der History bleibt

    $ long_command  
    $ #long_command  
    $ stuff_1  
    $ stuff_2  
    $ #long_command  
    $ long_command
    
    • In zsh geht das mit dem Binding "push-line-or-edit", und in bash lässt sich etwas Ähnliches mit C-u und anschließend C-y umsetzen
    • Noch einfacher ist es, mit ctrl-u die aktuelle Zeile zu speichern und zu leeren und sie dann mit ctrl-y wieder einzufügen. In zsh kann alt-q diesen Ablauf automatisieren
    • In bash kann man mit alt-shift-3 vor den aktuellen Befehl ein # setzen und in eine neue Zeile wechseln
  • Der 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

    • Auch der Stil des Artikels wirkt insgesamt nach LLM. Zum Beispiel Sätze wie „The shell is a toolbox, not an obstacle course.“
    • Auch PowerShell hat einen readline mode, was den Wechsel verringert, wenn man parallel mit WSL arbeitet
    • readline verhält sich wie ein Teil von bash, daher finde ich es völlig in Ordnung, solche Tipps als Shell-Funktionen zu bezeichnen
  • In meiner zsh-Konfiguration verwende ich eine Funktion, um bestimmte Befehle aus der History auszuschließen
    So bleiben zum Beispiel riskante Befehle wie --force nicht in der History stehen

    function zshaddhistory() {
      emulate -L zsh
      if ! [[ "$1" =~ "(^ |--force|whatever)" ]] ; then
        print -sr -- "${1%%$'\n'}"
        fc -p
      else
        return 1
      fi
    }
    
    • Ich mache etwas Ähnliches und habe ein Alias, das vorn ein Leerzeichen einfügt, für Befehle, die nicht protokolliert werden sollen
      unhist () { alias $1=" $1"; }
      unhist unhist
      unhist fzf
      unhist rghist
      
  • In zsh verwende ich ein Snippet für die automatische Erweiterung globaler Aliase
    Zum Beispiel führt alias -G G='rg -s' dazu, dass command | G automatisch zu command | rg -s erweitert wird
    Bei Eingabe eines Leerzeichens wird automatisch erweitert, und mit \alias kann man die Erweiterung überspringen

  • Ich habe eine „deep cd“-Funktion in meiner .bashrc
    Sie wechselt automatisch in das erste Verzeichnis, das die als Argument übergebene Zeichenkette enthält

    dcd() {
      [ -z "$1" ] && return
      local dir
      dir=$(find . -type d -path "*$1*" -print -quit 2>/dev/null)
      [ -n "$dir" ] && cd "$dir"
    }
    

    Ich dachte erst, sie wäre langsam, aber am Ende benutze ich sie überraschend oft

    • Es lohnt sich auch, smarte cd-Tools wie autojumps jc, z oder fzf anzuschauen
 
phoon 2026-03-30

Das Remapping der Pfeiltaste nach oben macht man als Emacs-Nutzer einfach mit c-r. Am Ende des Tunings steht die Standardeinstellung.