BASH prend en charge une $PROMPT_COMMAND
variable d'environnement qui définit une commande à exécuter avant toute invite interactive de premier niveau. Je recherche un équivalent ZSH de cela.
La documentation dit qu'il y a une fonction que precmd
je peux définir pour y parvenir; cependant, je ne sais pas comment le définir à partir d'une variable d'environnement.
J'ai envisagé de passer une variable d'environnement qui obligerait ZSH à lire un fichier contenant la définition de cette fonction, mais ZSH ne semble pas prendre en charge de telles choses : il ne lit que les fichiers globaux, puis les fichiers par utilisateur. Je peux les remplacer mais je ne peux pas y ajouter sans modifier les fichiers, ce que je ne peux pas faire.
Alors, comment puis-je définir un hook pré-invite dans ZSH via une variable d'environnement, comme je le ferais $PROMPT_COMMAND
en BASH?
la source
exit
etexec
, ok;)
)start() { eval "$@"; echo post-command-code }
puis utilisez une liaison zle pour exécuter la ligne de commande avecstart
préfixé?DEBUG
piège est une bonne trouvaille, mais vous avez toujours du mal à le définir. J'ai étendu ma réponse une fois de plus, mais je vous laisse écrire votre propre réponse concernant la solution de piège DEBUG.:)
Réponses:
L'approche la plus simple pour émuler les bash
$PROMPT_COMMAND
qui me vient à l'esprit est d'utiliser leprecmd
crochet, comme vous l'avez déjà compris. Définissez-le commeet vous pouvez faire quelque chose comme ça:
Veuillez noter les guillemets simples dans cet exemple, sinon ils
$(date)
seront développés trop tôt, c'est-à-dire déjà lors de la définition$PROMPT_COMMAND
et non lorsqu'ils seront appelés avant l'invite.Si vous souhaitez conserver (et ne souhaitez pas modifier) la définition existante, vous pouvez utiliser cette approche:
Avec cela, les
prmptcmd
fonctions sont exécutées après laprecmd()
fonction existante .Enfin, voici un moyen qui convient à une utilisation dans un package de programme, qui ne doit pas modifier les fichiers utilisateur ou système ni entrer les commandes de manière interactive.
Un exemple pour lancer une session bash pourrait être
Pour générer zsh, vous pouvez utiliser
ce qui fait
/program/dir/.zshrc
que la source. Dans ce fichier, leprecmd()
crochet peut être défini comme expliqué ci-dessus. Si vous souhaitez que les paramètres de l'utilisateur , en plus comprennent ,source $HOME/.zshrc
etc. dans le .zshrc aussi du programme. Cette configuration est maintenable, car aucun fichier en dehors du répertoire du programme n'est modifié.Comme dernier ajout, voici une preuve de concept sur la façon de souhaiter la bienvenue au nouvel utilisateur. Utilisez le code suivant dans votre
/program/dir/.zshenv
fichier de configuration rc:la source
.zshrc
? (3) Un exemple:foo() { echo foo }; bar() { echo bar }; precmd_functions=(foo bar)
Ceci s'exécutefoo()
etbar()
en plus deprecmd()
.PROMPT_COMMAND="echo foo" bash
, non? Est - ce possible d'un pour le frai zsh:ZDOTDIR=/program/dir zsh
. Puis/program/dir/.zshrc
est originaire au démarrage où vous pouvez définir le hook precmd (). Si vous voulez que l'utilisateur inclue en plussource $HOME/.zshrc
etc. dans le zshrc du programme. Cela devrait être facile à maintenir, car aucun fichier en dehors du répertoire du programme n'est modifié.Comme l'indique @mypy, Zsh
precmd
fonctionne de manière similaire à BashPROMPT_COMMAND
.Voici un exemple qui fonctionne pour Bash ou Zsh et n'utilise pas
eval
:Exécuter à partir de scripts d'initialisation shell:
et:
Les invites ici ne sont que des exemples. On peut certainement faire des choses beaucoup plus délicates.
Pour plus de détails sur la définition des fonctions d'invite, voir: http://zsh.sourceforge.net/Doc/Release/Functions.html#index-precmd et http://www.gnu.org/software/bash/manual/bashref.html # Impression rapide .
Pour plus de détails sur les extensions rapides, voir http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html et http://www.gnu.org/software/bash/manual/bashref.html#Printing-a -Invite .
la source