Quel est le meilleur moyen d'exécuter un script lors de la saisie dans un répertoire?
Lorsque je déménage dans un nouveau répertoire, j'aimerais que bash exécute le script projectSettings.bash un peu comme le fait RVM.
Quel est le meilleur moyen d'exécuter un script lors de la saisie dans un répertoire?
Lorsque je déménage dans un nouveau répertoire, j'aimerais que bash exécute le script projectSettings.bash un peu comme le fait RVM.
Réponses:
Vous pouvez créer cd
une fonction (et pop
et pushd
) et la faire détecter si vous entrez dans ce répertoire particulier.
cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
unset_all_project_settings () {
# do whatever it takes to undo the effect of projectSettings.bash,
# e.g. unset variables, remove PATH elements, etc.
}
chpwd () {
case $PWD in
/some/directory|/some/other/directory) . ./projectSettings.bash;;
*) unset_all_project_settings;;
esac
}
Ne le faites pas dans des répertoires que vous n'avez pas inscrits sur la liste blanche, car il serait très facile pour quelqu'un de vous faire tromper pour exécuter du code arbitraire - vous envoyer une archive, vous la décompressez ainsi, vous accédez au répertoire qu'il a créé et vous ' Nous allons maintenant exécuter le code de l'attaquant.
Je ne recommande pas cette approche, car cela signifie que le script sera exécuté même si vous entrez dans ce répertoire pour une raison quelconque qui n'est pas liée au travail sur le projet. Je suggère d'avoir une fonction spécifique qui modifie le répertoire du projet et source le script de paramètres.
myproj () {
cd /some/directory && . ./projectSettings.bash
}
cd
et il existe sans aucun doute une meilleure solution. Même utiliser $ PROMPT_COMMAND, c'est mieux!
if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. C'est pour éviter les problèmes si vous faites quelque chose comme PATH = / mytools / bin: $ PATH comme type d'initialisation.
direnv pourrait être ce que vous recherchez.
Voici un exemple tiré de la documentation officielle:
$ cd ~/my_project
$ echo ${FOO-nope}
nope
$ echo export FOO=foo > .envrc
.envrc is not allowed
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
$ echo ${FOO-nope}
foo
$ cd ..
direnv: unloading
direnv export: ~PATH
$ echo ${FOO-nope}
nope