Jaki jest najlepszy sposób wykonania skryptu podczas wchodzenia do katalogu?
Kiedy przeprowadzam się do nowego katalogu, chciałbym, aby bash wykonał skrypt projectSettings.bash podobnie jak RVM.
Jaki jest najlepszy sposób wykonania skryptu podczas wchodzenia do katalogu?
Kiedy przeprowadzam się do nowego katalogu, chciałbym, aby bash wykonał skrypt projectSettings.bash podobnie jak RVM.
Odpowiedzi:
Możesz utworzyć cd
funkcję (i pop
i pushd
) i sprawić, że wykryje, czy przejdziesz do tego konkretnego katalogu.
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
}
Nie rób tego w katalogach, których nie umieściłeś na białej liście, ponieważ bardzo ułatwiłoby ci to nakłonienie cię do uruchomienia dowolnego kodu - wyślij ci archiwum, więc rozpakuj je, przejdź do utworzonego katalogu i „ uruchomiliśmy teraz kod atakującego.
Nie polecam tego podejścia, ponieważ oznacza to, że skrypt zostanie wykonany, nawet jeśli wejdziesz do tego katalogu z jakiegoś powodu niezwiązanego z pracą nad projektem. Sugeruję posiadanie określonej funkcji, która zmienia katalog projektu i pobiera skrypt ustawień.
myproj () {
cd /some/directory && . ./projectSettings.bash
}
cd
i bez wątpienia jest lepszy sposób. Nawet użycie $ PROMPT_COMMAND jest lepsze!
if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. Ma to na celu uniknięcie problemów na wypadek, gdybyś zrobił coś PATH = / mytools / bin: $ PATH inicjalizacja.
direnv może być tym, czego szukasz.
Oto przykład zaczerpnięty z oficjalnej dokumentacji:
$ 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