zsh fournit de belles fonctions de hook , y compris chpwdpour 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,pushdetpopd) - Il doit s'exécuter après la commande de l'utilisateur, donc
trap "my_function" DEBUGcela ne fonctionne pas, à moins que je ne puisse dire en quelque sorte, "exécutez d'abord le$BASH_COMMANDnous avons piégé, puis faites aussi cela ..." Je vois que je peux éviter l'exécution automatique de$BASH_COMMANDsiextdebugest activé et la fonction trap renvoie 1, mais je ne pense pas que je veux forcerextdebug, et le retour1pour 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?
cdcomme principe.
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )veuillez ne pas modifier les commandes Unix fiables.
bashce qui fonctionne à peu près de la même manière sur tous les systèmes d'exploitation sur lesquels il fonctionne.
cd,pushdetpopd? Combien d'autres façons de changer de répertoire?