
Ich verwende ZSH über Oh-my-zsh und habe eine nette Funktion entdeckt: Die Shell erweitert meine Befehle, wenn sie in Backticks stehen.
Beispielsweise wird `pwd`
+ durch meinen aktuellen Pfad tabersetzt :`pwd`
Ich frage mich, ob es eine relativ einfache Möglichkeit gibt, dasselbe für einige Befehle zu tun, ohne die Backticks verwenden zu müssen. Ich würde das gerne auf einige Aliase (oder Funktionen) anwenden.
Um es klarzustellen: Ich spreche nicht über die Erweiterung von Argumenten eines Befehls, sondern über den Befehl selbst.
Dies ist eine wirklich erstaunliche Funktion, aber nicht genau das, wonach ich gesucht habe. Sofern ich nichts falsch gemacht habe, wird mein Alias dadurch auf das erweitert, wofür der Alias definiert wurde, aber nicht auf das, was das Ergebnis ist. Zum Beispiel hier:
Ich möchte das Ergebnis dieses Befehls statt des vollständigen Befehls sehen.
Antwort1
Sie können hierfür ein benutzerdefiniertes Zle-Widget verwenden und es per Tastenkombination aufrufen, zum Beispiel Alt+ Tab(identisch mit Esc, Tab).
expand-to-output () {
BUFFER='$('$BUFFER')'
CURSOR=0
zle redisplay
zle expand-word
}
zle -N expand-to-output
bindkey "^[^I" expand-to-output
Wenn Sie nun einen beliebigen Befehl gefolgt von Alt+ eingeben Tab, wird der gesamte Befehl durch seine Ausgabe ersetzt.Wennder Befehl konnte erfolgreich ausgeführt werden. Wenn der Befehl nicht erfolgreich ausgeführt werden kann, wird die eingegebene Befehlszeile nur umschlossen, $(...)
aber nicht erweitert. Wenn Fehlermeldungen aufgetreten sind, sollten diese über dem Bearbeitungspuffer gedruckt werden. Dies funktioniert möglicherweise bei mehrzeiligen Eingabeaufforderungen nicht zuverlässig.
Erläuterung:
expand-to-output () {...}
definiert die (neue)expand-to-output
Funktion.BUFFER
enthält die aktuelle BefehlszeileBUFFER='$('$BUFFER')'
Stellen$(
vor und)
nach der Befehlszeile.$(...)
ist gleichwertig,`...`
kann aber verschachtelt werden.CURSOR
ist die Position des Cursors auf der BefehlszeileCURSOR=0
setzt den Cursor an den Anfang der (bearbeiteten) Befehlszeile, also auf$
. Ohne den Cursor dorthin zu bewegen, kann es passieren, dasszsh
versucht wird, ein Wort innerhalb von zu erweitern,$(...)
anstatt den gesamten Prozess der Ersetzung durchzuführen.zle redisplay
zeigt den Editierpuffer erneut an. Dies verhindert Anzeigefehler, falls der erweiterte Befehl etwas ausgibt,stderr(Hinweis: Bei mehrzeiligen Eingabeaufforderungen kann es zu Problemen kommen.)zle expand-word
ruft dasexpand-word
Widget auf, das normalerweise oft im Rahmen der Tab-Vervollständigung aufgerufen wird.zle -N expand-to-output
registriert die Funktion als gleichnamiges Widget.bindkey "^[^I" expand-to-output
bindet dasexpand-to-output
Widget an Alt+ Tab.