Ausrufezeichen in der Shell: Nicht zum Schreien, sondern zum Faulsein
A shell exclamation mark is not for yelling. Be lazy

In der Shell können Ausrufezeichen (Event Designators) und der Befehl `fc` dir helfen, vorherige Befehle und Argumente wiederzuverwenden, ohne endlos Pfeil-hoch zu drücken. Der Artikel erklärt die Syntax von Event Designators (Ereignis-, Wort- und Modifikator-Designatoren) und zeigt praktische Beispiele für bash, csh, tcsh und zsh. Außerdem wird die POSIX-konforme Alternative `fc` vorgestellt, mit der du Befehle in deinem Editor bearbeiten kannst. Ein kurzer Leitfaden für die wichtigsten Abkürzungen und Tipps zur Deaktivierung runden den Beitrag ab.
Ausrufezeichen sind nicht zum Schreien da – zumindest nicht in deiner Shell.
- userbinator
Jedes Mal, wenn das jemand anspricht, denke ich mir "oh stimmt, das könnte ich machen" und vergesse es dann sofort wieder. Besonders wenn man schnell tippen kann, ist es einfacher, einfach "geradeaus weiterzufahren" mit dem Befehl, den man will, als eine weitere "mentale Abzweigung" einzubauen, die den Fluss unterbricht. Aus demselben Grund drücke ich oft Strg+C und fange nochmal an, anstatt zu versuchen, mit der Rücktaste zu korrigieren.
- idoubtit
Vor Jahrzehnten wurde mir beigebracht, `!` und Co. zu verwenden, von einem Linux-Benutzer, der den `sudo !!`-Trick mochte. Dann bin ich von dieser impliziten Interpolation zu expliziten Abkürzungen gewechselt, und ich bin froh, dass ich das getan habe.
Wie im FAQ unten vorgeschlagen, kann man statt !… Strg-R verwenden. Oder besser, optional die ersten Buchstaben tippen und dann Alt-P oder "Hoch". Das ist mächtiger und erweiterbarer. Andere Abkürzungen wie Alt-. erlauben es, in vergangene Parameter zu navigieren.
Mit Hoch, Alt-P, Alt-. und ähnlichem zeigt die Befehlszeile den echten Befehl an. Die !…-Magie ist fehleranfälliger und mehrdeutig; bei zsh würde ich vorschlagen, TAB zu drücken, um die Magie zu statischem Text zu erweitern.
Ich würde dem FAQ weitere Einträge hinzufügen: Wenn ich `sudo !!` eingebe, wird es dann unverändert im Shell-Verlauf gespeichert oder nach Interpolation von `!!`? Wenn ich eine Befehlszeile mit einem Leerzeichen beginne, sodass zsh sie nicht in den Shell-Verlauf aufnimmt, ignoriert !… diese Zeile dann auch? Ist `!$` rekursiv?
- miki123211
IMO ist !$ das Nützlichste von allen (es wird durch das letzte Argument des letzten Befehls ersetzt).
!! kannst du genauso einfach mit Pfeil-hoch-Eingabe machen, was genauso schnell ist. !ssh kannst du mit Strg+R machen, was dir tatsächlich zeigt, was ausgeführt wird und ob das letzte ssh dorthin geht, wo du denkst. sudo !! ist Pfeil-hoch, Strg+A, 'sudo ', ein Tastendruck mehr, aber es ist natürlich, wenn du dein Readline kennst. Der Rest ist zu komplex und es lohnt sich nicht, es zu lernen. !$ ist der Sweet Spot.
- inigyou
Das ist für Fernschreiber. Für diejenigen von uns mit interaktiven elektronischen Videoanzeigen können wir die Pfeil-hoch-Taste verwenden, um den letzten Befehl abzurufen, oder Strg-R, um im Verlauf zu suchen, und dann den abgerufenen Befehl bearbeiten.
- Terr_
Statt eines Gefühls von "cool" oder "nützlich" fühle ich irgendwie nur Verzweiflung darüber, wie organisch verworren es ist, herauszufinden, was etwas in einer Befehlszeile wirklich tut. Fairerweise war ich schon immer voreingenommen gegenüber "nur die einfachsten Skripte sollten in Shell-Sprachen sein".
Das fügt auch eine faszinierende neue Dimension hinzu, wenn es darum geht, Shell-Befehle als harmlos und korrekt zu überprüfen/verifizieren... Wie lange dauert es, bis LLMs anfangen, den Trick in kleinen Anfragen zu (miss)brauchen, die sie von mir genehmigt haben wollen?