디렉토리 입력시 bash 스크립트 실행


40

디렉토리에 들어갈 때 스크립트를 실행하는 가장 좋은 방법은 무엇입니까?
새 디렉토리로 옮길 때 bash가 RVM처럼 projectSettings.bash 스크립트를 실행하고 싶습니다.


2
모든 디렉토리 또는 선택한 디렉토리로? 그리고 각각에 대해 동일한 스크립트입니까?
enzotib

모든 디렉토리. projectSettings.bash라는 디렉토리에있는 스크립트 (있는 경우)
MageProspero

답변:


46

당신은 할 수있다 cd(그리고 기능 poppushd), 당신은 특정 디렉토리를 입력하면이를 감지합니다.

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
}

허용되지 않은 디렉토리에서는이 작업을 수행하지 마십시오. 다른 사람이 임의 코드를 실행하도록 유도하기가 매우 쉽습니다. 아카이브를 보내서 압축을 풀고 생성 한 디렉토리로 변경하면됩니다. ve는 이제 공격자의 코드를 실행합니다.

이 방법은 프로젝트 작업과 관련이없는 이유로 디렉토리를 입력하더라도 스크립트가 실행된다는 것을 의미하므로 권장하지 않습니다. 프로젝트 디렉토리로 변경하고 설정 스크립트를 제공하는 특정 기능을 갖는 것이 좋습니다.

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

1
나는 얼마 전에 루비에서 시작했습니다. RVM 도구는 완전히 Bash에 있으며 내가 본 최고의 Bash 마법 중 하나입니다. 나는 당신이 할 수있는 절대적으로 나쁜 일 중 하나가 비슷한 것을 타는 것이지 cd의심의 여지없이 더 좋은 방법이 있기 때문에 대답은 약간 어리석은 것이라고 생각합니다 . $ PROMPT_COMMAND를 사용하는 것이 더 좋습니다!
MageProspero

3
나는 완전히 틀렸고 사과했다. RVM이 CD를 오버로드했습니다.
MageProspero

5
(이 코멘트 스레드에서 접선 프로 / 안티 루비 물건을 제거했습니다)
Michael Mrozek

1
projectSettings.bash에서 디렉토리를 종료 / 다시 입력 할 때 초기화를 반복하지 않도록 플래그 변수를 추가하는 것이 좋습니다. 따라서 모든 것을로 묶습니다 if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi. 이는 PATH = / mytools / bin : $ PATH 종류의 초기화를 수행하는 경우 문제를 피하기위한 것입니다.
거미

5
@spider 오히려 디렉토리를 떠나면 일종의 설정 해제 메커니즘이 있어야합니다. 나가고 다시 들어가면 설정을 다시 가져와야합니다!
Gilles 'SO- 악마 중지'

0

direnv 는 당신이 찾고있는 것일 수 있습니다.

공식 문서에서 가져온 예는 다음과 같습니다.

$ 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.