Qual è il modo migliore per eseguire uno script quando si accede a una directory?
Quando mi sposto in una nuova directory, vorrei che bash eseguisse lo script projectSettings.bash proprio come fa RVM.
Qual è il modo migliore per eseguire uno script quando si accede a una directory?
Quando mi sposto in una nuova directory, vorrei che bash eseguisse lo script projectSettings.bash proprio come fa RVM.
Risposte:
È possibile creare cd
una funzione (e pop
e pushd
) e farlo rilevare se si immette quella directory specifica.
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
}
Non farlo nelle directory che non hai inserito nella whitelist, perché sarebbe molto facile per qualcuno indurti a eseguire codice arbitrario: invia un archivio, quindi decomprimilo, cambia nella directory che ha creato e tu ' ora eseguo il codice dell'attaccante.
Non consiglio questo approccio, perché significa che lo script verrà eseguito anche se si immette quella directory per qualche motivo non correlato al lavoro sul progetto. Suggerisco di avere una funzione specifica che cambia nella directory del progetto e genera lo script delle impostazioni.
myproj () {
cd /some/directory && . ./projectSettings.bash
}
cd
e senza dubbio c'è un modo migliore. Anche usare $ PROMPT_COMMAND è meglio!
if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. Questo per evitare problemi nel caso in cui si faccia qualcosa PATH = / mytools / bin: $ PATH tipo di inizializzazione.
direnv potrebbe essere quello che stai cercando.
Ecco un esempio tratto dalla documentazione ufficiale:
$ 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