zsh fournit de belles fonctions de hook , y compris chpwd
pour exécuter une fonction après que l'utilisateur a changé de répertoire.
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
J'essaie d'imiter ça en bash.
Contraintes:
- Il doit fonctionner à la fois dans des shells interactifs et non interactifs, ce qui signifie, je pense, qu'il ne peut pas s'appuyer sur quelque chose comme
$PROMPT_COMMAND
- Il ne peut pas être redéfini
cd
, car je veux qu'il fonctionne pour toute commande qui modifie les répertoires (par exemple,pushd
etpopd
) - Il doit s'exécuter après la commande de l'utilisateur, donc
trap "my_function" DEBUG
cela ne fonctionne pas, à moins que je ne puisse dire en quelque sorte, "exécutez d'abord le$BASH_COMMAND
nous avons piégé, puis faites aussi cela ..." Je vois que je peux éviter l'exécution automatique de$BASH_COMMAND
siextdebug
est activé et la fonction trap renvoie 1, mais je ne pense pas que je veux forcerextdebug
, et le retour1
pour une commande réussie (mais modifiée) semble incorrect.
La dernière partie - "exécuter après la commande de l'utilisateur" - est ce qui me dérange actuellement. Si je peux exécuter une fonction après chaque commande, je peux la faire vérifier si le répertoire a changé depuis notre dernière vérification. Par exemple:
function check_pwd() {
# true in a new shell (empty var) or after cd
if [ "$LAST_CHECKED_DIR" != "$PWD" ]; then
my_function
fi
LAST_CHECKED_DIR=$PWD
}
Suis-je sur la bonne voie ou existe-t-il une meilleure solution? Comment puis-je exécuter une commande dans bash après que l'utilisateur a changé de répertoire?
cd
comme principe.
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
veuillez ne pas modifier les commandes Unix fiables.
bash
ce qui fonctionne à peu près de la même manière sur tous les systèmes d'exploitation sur lesquels il fonctionne.
cd
,pushd
etpopd
? Combien d'autres façons de changer de répertoire?