Verwenden Sie preexec (), um den eingegebenen Befehl - zsh - auszuwerten

Ich möchte preexec () verwenden, um bestimmte zu ändernBefehle, bevor sie ausgeführt werden, aber ich muss in der Lage sein, den aktuell eingegebenen Befehl auszuwerten. Gibt es eine Variable, die den gesamten Befehl enthält, bevor er ausgeführt wird? Ich kenne !! ist der letzte Befehl, aber ich brauche die aktuelle Zeile, bevor sie im Verlauf gespeichert wird.

Ein Beispiel von dem, was ich tun möchte, würde wahrscheinlich helfen

ls -l /root bitch

Und dann möchte ich preexec sehen, dass ich am Ende Schlampe geschrieben habe und sie durch ersetze

sudo ls -l /root

Ich denke so etwas wie

preexec() {
if [[ $CURRENT_LINE =~ bitch$ ]]; then
$CURRENT_LINE="sudo ${CURRENT_LINE% bitch}"
fi

Würde funktionieren, aber ich kann keine Variable in zsh finden, die mir die korrekte $ CURRENT_LINE gibt

Für Bonuspunkte möchte ich auch eintreten können bitch auf einer Linie für sich und lassen Sie es laufen sudo !! aber ich könnte das wahrscheinlich mit einer Art Alias ​​machen.

Ich denke, es könnte besser sein, ein zu machen bitch Funktion, der ich einen Befehl übergeben kann, aber ich glaube nicht, dass das funktionieren wird, weil der Befehl ausgeführt wird und fehlschlägt (vor dem Piping), bevor es erneut mit Sudo ausgeführt wird.

Antworten:

4 für die Antwort № 1

Soweit ich weiß, dass die preexec ist nicht an der richtigen Stelle, um den auszuführenden Befehl zu modifizieren. Wir kann nicht ändern die Befehle, die von innen ausgeführt werden preexec Funktion…

Obwohl der eigentliche auszuführende Befehl als übergeben wird $1, $2 und $3.

preexec

Wird ausgeführt, unmittelbar nachdem ein Befehl gelesen wurde undwird gerade ausgeführt. Wenn der Protokollmechanismus aktiv ist (und die Zeile nicht aus dem Protokollpuffer gelöscht wurde), wird die Zeichenfolge, die der Benutzer eingegeben hat, als erstes Argument übergeben, andernfalls ist es eine leere Zeichenfolge. Der eigentliche Befehl, der ausgeführt wird (einschließlich der erweiterten Aliase), wird in zwei verschiedenen Formen übergeben: Das zweite Argument ist eine einzeilige, größenbegrenzte Version des Befehls (mit Dingen wie Funktionskörpern); Das dritte Argument enthält den vollständigen Text, der ausgeführt wird.

- zshmisc(1) 9.3.1 Hook-Funktionen

Beispielsweise:

alias ls="ls -sF --color=auto"
preexec () {
print ">>>preexec<<<"
print -l ${(qqq)@}
}

Wenn ich oben in ~/.zshrc dann werde ich folgen:

% echo test preexec<Esc-Return>
ls<Return>
;# outputs below
>>>preexec<<<
"echo test preexec
ls"
"echo test preexec; ls -sF --color=auto"
"echo test preexec
ls -sF --color=auto"
test preexec
total 1692
...

Sie könnten Ihre eigenen Zle-Widget-Funktionen zum Bearbeiten des Zeileneditorpuffers zum zsh-Zeileneditor hinzufügen. (zshzle(1))

Sie könnten die Widget-Funktion zle hinzufügen, um das Verhalten beim Schlagen zu ändern Eingeben.

my-accept-line () {
if [[ "$BUFFER" == *" bitch" ]]; then
BUFFER="sudo ${BUFFER% bitch}"
fi
zle .accept-line
}
zle -N accept-line my-accept-line

Die obigen Snippets ändern die Funktionalität für accept-line vom eingebauten Verhalten zu my-accept-line hier definiert.


Hinzufügen der Abkürzungen könnte auch helfen, die unten beschrieben wird:

Cloning vim "s Abkürzung Feature

- "Beispiele: zleiab [ZshWiki]" - http://zshwiki.org/home/examples/zleiab