BASH unterstützt eine $PROMPT_COMMAND
Umgebungsvariable, die einen Befehl definiert, der vor jeder interaktiven Eingabeaufforderung der ersten Ebene ausgeführt werden soll. Ich suche ein ZSH-Äquivalent davon.
Die Dokumentation besagt, dass es eine Funktion gibt, die precmd
ich definieren kann, um dies zu erreichen. Ich habe jedoch keine Ahnung, wie man es aus einer Umgebungsvariablen definiert.
Ich habe überlegt, eine Umgebungsvariable zu übergeben, mit der ZSH eine Datei mit der Definition dieser Funktion lesen würde, aber ZSH scheint solche Dinge nicht zu unterstützen : Es werden nur globale Dateien und dann benutzerspezifische Dateien gelesen. Ich kann sie ersetzen, aber nicht hinzufügen, ohne die Dateien zu ändern, was ich nicht kann.
Wie definiere ich in ZSH einen Hook vor der Eingabeaufforderung über eine Umgebungsvariable, wie ich es $PROMPT_COMMAND
in BASH tun würde?
quelle
exit
exec
;)
start() { eval "$@"; echo post-command-code }
und verwenden Sie dann eine Zle-Bindung, um die Befehlszeile mitstart
vorangestelltem auszuführen ?DEBUG
Falle ist eine nette Entdeckung, aber Sie haben immer noch das Problem, wie man sie definiert. Ich habe meine Antwort noch einmal erweitert, aber ich überlasse es Ihnen, Ihre eigene Antwort in Bezug auf die DEBUG-Trap-Lösung zu schreiben.:)
Antworten:
Der einfachste Ansatz, um Bashs zu emulieren,
$PROMPT_COMMAND
der mir in den Sinn kommt, ist die Verwendung desprecmd
Hooks, wie Sie bereits herausgefunden haben. Definiere es alsund Sie können so etwas tun:
Bitte beachten Sie die einfachen Anführungszeichen in diesem Beispiel, da diese sonst
$(date)
zu früh, dh bereits beim Definieren$PROMPT_COMMAND
und nicht beim Aufrufen vor der Eingabeaufforderung, erweitert werden.Wenn Sie die vorhandene Definition beibehalten (und nicht ändern) möchten, können Sie diesen Ansatz verwenden:
Damit werden die
prmptcmd
Funktionen nach der vorhandenenprecmd()
Funktion ausgeführt.Schließlich ist hier ein Weg, der zur Verwendung in einem Programmpaket geeignet ist, das weder Benutzer- oder Systemdateien modifizieren sollte noch die Befehle interaktiv eingeben kann.
Ein Beispiel für das Starten einer Bash-Sitzung könnte sein
Um zsh zu erzeugen, können Sie verwenden
welches veranlasst
/program/dir/.zshrc
, beschafft zu werden. In dieser Datei kann derprecmd()
Hook wie oben beschrieben definiert werden. Wenn Sie möchten , die Einstellungen des Benutzers zusätzlich enthaltensource $HOME/.zshrc
usw. in dem .zshrc Programm auch. Dieses Setup kann beibehalten werden, da keine Dateien außerhalb des Programmverzeichnisses geändert werden.Als letzte Ergänzung finden Sie hier einen Proof-of-Concept, wie Sie den neuen Benutzer ebenfalls willkommen heißen können. Verwenden Sie den folgenden Code in Ihrer
/program/dir/.zshenv
RC-Konfigurationsdatei:quelle
.zshrc
? (3) Ein Beispiel:foo() { echo foo }; bar() { echo bar }; precmd_functions=(foo bar)
Dies wird ausgeführtfoo()
undbar()
zusätzlich zuprecmd()
.PROMPT_COMMAND="echo foo" bash
, oder? Ist das eine Möglichkeit zum Laichen zsh:ZDOTDIR=/program/dir zsh
./program/dir/.zshrc
Wird dann beim Start bezogen, wo Sie den Haken precmd () definieren können. Wenn Sie möchtensource $HOME/.zshrc
, fügen Sie dem Benutzer zusätzlich usw. in das zshrc des Programms hinzu. Dies sollte einfach zu warten sein, da keine Dateien außerhalb des Programmverzeichnisses geändert werden.Wie @mypy angibt, funktioniert Zshs
precmd
ähnlich wie BashsPROMPT_COMMAND
.Hier ist ein Beispiel, das für Bash oder Zsh funktioniert und nicht verwendet wird
eval
:Führen Sie von Shell-Init-Skripten aus:
und:
Die Aufforderungen hier sind nur Beispiele. Man kann definitiv viel kniffligere Sachen machen.
Einzelheiten zum Festlegen von Eingabeaufforderungsfunktionen finden Sie unter: http://zsh.sourceforge.net/Doc/Release/Functions.html#index-precmd und http://www.gnu.org/software/bash/manual/bashref.html # Sofortdruck .
Ausführliche Informationen zu Eingabeaufforderungserweiterungen finden Sie unter http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html und http://www.gnu.org/software/bash/manual/bashref.html#Printing-a -Prompt .
quelle