Wykonuj skrypty bash po wejściu do katalogu

40

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.

MageProspero
źródło
2
Do każdego katalogu lub wybranych? I ten sam skrypt dla każdego, czy nie?
enzotib
Każdy katalog. Skrypt w katalogu o nazwie projectSettings.bash, jeśli istnieje.
MageProspero
Podobne pytanie o przepełnienie stosu
Gilles „SO- przestań być zły”

Odpowiedzi:

46

Możesz utworzyć cdfunkcję (i popi 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
}
Gilles „SO- przestań być zły”
źródło
1
Zacząłem w Ruby dopiero chwilę temu. Narzędzie RVM jest całkowicie w Bash i jednym z najlepszych kawałków magii Bash, jakie widziałem. Myślę, że odpowiedź jest trochę głupia, ponieważ jedną z absolutnie gorszych rzeczy, jaką możesz zrobić, jest przejechanie czegoś podobnego cdi bez wątpienia jest lepszy sposób. Nawet użycie $ PROMPT_COMMAND jest lepsze!
MageProspero
3
Byłem całkowicie w błędzie i przepraszam. RVM przeciążał cd.
MageProspero,
5
(usunięto niektóre styczne rzeczy pro / anty-Ruby z tego wątku komentarza)
Michael Mrozek
1
w projectSettings.bash Sugeruję dodanie zmiennej flag, aby nie powtarzać inicjalizacji w przypadku wyjścia / ponownego wejścia do katalogu. Więc zamknij wszystko w 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.
pająk
5
@ spider Raczej powinien istnieć jakiś mechanizm nieuzbrojony, jeśli opuścisz katalog. Jeśli wyjdziesz i wrócisz ponownie, powinieneś odzyskać ustawienia!
Gilles „SO- przestań być zły”
0

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
navigaid
źródło