Execute scripts bash ao entrar em um diretório

36

Qual é a melhor maneira de executar um script ao entrar em um diretório?
Quando eu entro em um novo diretório, eu gostaria que o bash executasse o script projectSettings.bash de maneira muito parecida com o RVM.

    
por Prospero 24.09.2011 / 21:39

2 respostas

48

Você pode tornar cd uma função (e pop e pushd ) e fazer com que ela seja detectada se você entrar nesse diretório específico.

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
}

Não faça isso em diretórios que você não tenha colocado na lista de permissões, pois isso tornaria muito fácil alguém enganá-lo para executar código arbitrário - enviar um arquivo para você, descompactá-lo, alterá-lo para o diretório criado, e agora você executa o código do invasor.

Eu não recomendo essa abordagem, porque significa que o script será executado mesmo se você entrar nesse diretório por algum motivo que não esteja relacionado ao trabalho no projeto. Eu sugiro ter uma função específica que muda para o diretório do projeto e origina o script de configurações.

myproj () {
  cd /some/directory && . ./projectSettings.bash
}
    
por 24.09.2011 / 21:52
0

direnv pode ser o que você está procurando.

Aqui está um exemplo retirado da documentação oficial:

$ 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
    
por 31.07.2018 / 09:15