Jalankan skrip bash saat memasuki direktori

40

Apa cara terbaik untuk menjalankan skrip saat masuk ke direktori?
Ketika saya pindah ke direktori baru, saya ingin bash untuk mengeksekusi script projectSettings.bash seperti RVM.

MageProspero
sumber
2
Ke dalam setiap direktori, atau yang dipilih? Dan skrip yang sama untuk masing-masing, atau tidak?
enzotib
Setiap direktori. Script dalam direktori bernama projectSettings.bash jika ada.
MageProspero
Pertanyaan serupa tentang Stack Overflow
Gilles 'SO- stop being evil'

Jawaban:

46

Anda dapat membuat cdfungsi (dan popdan pushd), dan membuatnya mendeteksi jika Anda memasuki direktori tertentu.

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
}

Jangan lakukan ini di direktori yang belum Anda daftar putih, karena akan membuatnya sangat mudah bagi seseorang untuk menipu Anda agar menjalankan kode arbitrer - kirim arsip kepada Anda, jadi Anda unzip, ubah ke direktori yang dibuat, dan Anda ' Saya sekarang menjalankan kode penyerang.

Saya tidak merekomendasikan pendekatan ini, karena itu berarti skrip akan dieksekusi bahkan jika Anda memasukkan direktori itu untuk beberapa alasan yang tidak terkait dengan mengerjakan proyek. Saya sarankan memiliki fungsi spesifik yang berubah ke direktori proyek dan sumber skrip pengaturan.

myproj () {
  cd /some/directory && . ./projectSettings.bash
}
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Saya baru mulai di Ruby beberapa saat yang lalu. Alat RVM yang benar-benar ada di Bash dan salah satu bagian terbaik dari sihir Bash yang pernah saya lihat. Saya pikir jawabannya agak konyol karena salah satu hal yang benar-benar lebih buruk yang dapat Anda lakukan adalah menunggang sesuatu seperti cddan ada tanpa keraguan cara yang lebih baik. Bahkan menggunakan $ PROMPT_COMMAND lebih baik!
MageProspero
3
Saya sepenuhnya salah dan meminta maaf. RVM kelebihan beban cd.
MageProspero
5
(menghapus beberapa hal tangensial pro / anti-Ruby dari utas komentar ini)
Michael Mrozek
1
di projectSettings.bash saya sarankan Anda untuk menambahkan variabel flag untuk tidak mengulangi inisialisasi jika Anda keluar / masukkan kembali direktori. Jadi sertakan semuanya if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi. Ini untuk menghindari masalah jika Anda melakukan sesuatu PATH = / mytools / bin: $ inisialisasi semacam PATH.
laba
5
@ spider Sebaliknya harus ada semacam mekanisme yang tidak disetel jika Anda meninggalkan direktori. Jika Anda pergi dan masuk kembali, Anda harus mendapatkan pengaturan kembali!
Gilles 'SO- stop being evil'
0

direnv mungkin apa yang Anda cari.

Berikut ini contoh yang diambil dari dokumentasi resmi:

$ 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
sumber