Bir dizine girerken bash komut dosyalarını yürütün


40

Bir dizine girerken bir betiği çalıştırmanın en iyi yolu nedir?
Yeni bir dizine taşındığımda, bash'ın RVM'nin yaptığı gibi projectSettings.bash betiğini çalıştırmasını istiyorum.


2
Her dizine mi, yoksa seçili olanlara mı? Ve her biri için aynı senaryo, değil mi?
enzotib 24:11

Her dizin Dizindeki komut dosyası, varsa projectSettings.bash adında.
MageProspero 24:11

Yanıtlar:


46

Sen yapabilir cd(ve bir işlev popve pushd) ve bu özel dizin girerseniz o algılamak olun.

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
}

Bunu beyaz listeye almadığınız dizinlerde yapmayın, çünkü birisinin sizi rasgele kod çalıştırması için kandırması çok kolay olacaktır - size bir arşiv gönderir, bu yüzden onu açarsınız, oluşturduğunuz dizine değiştirirsiniz ve şimdi saldırganın kodunu çalıştır.

Bu yaklaşımı önermiyorum, çünkü komut dosyası, proje üzerinde çalışmakla ilgisi olmayan bir nedenden dolayı bu dizine girseniz bile yürütülecek demektir. Proje dizininde değişen ve ayar betiğini sağlayan belirli bir işleve sahip olmanızı öneririm.

myproj () {
  cd /some/directory && . ./projectSettings.bash
}

1
Ruby'de sadece bir süre önce başladım. RVM aracı tho tamamen Bash'te ve gördüğüm en iyi Bash sihirinden biri. Bence cevap biraz aptalca çünkü yapabileceğiniz en kötü şeylerden biri, benzer bir şeye fazladan binmek cdve şüphesiz daha iyi bir yol var. $ PROMPT_COMMAND kullanmak bile daha iyi!
MageProspero

3
Tamamen yanlıştım ve özür dilerim. RVM cd'yi aşırı yüklüyordu.
MageProspero

5
(Bu yorum
başlığından

1
projectSettings.bash içinde, dizinden çıkmanız / tekrar girmeniz durumunda başlatmayı tekrarlamamaya yönelik bir bayrak değişkeni eklemenizi öneririm. Yani her şeyi içine alın if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi. Bu, PATH = / mytools / bin: $ PATH türünde bir başlangıç ​​yapmanız durumunda problemleri önlemek içindir.
örümcek

5
@ spider Dizini terk ederseniz, bunun yerine bir tür bozulmamış mekanizma olması gerekir. Ayrılır ve tekrar girerseniz ayarları geri almalısınız!
Gilles 'SO- kötülük yapmayı bırak'

0

diren , aradığın şey olabilir.

İşte resmi belgelerden alınmış bir örnek:

$ 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.