두 디렉터리 간에 $PATH 변수가 다른 이유는 무엇입니까?

두 디렉터리 간에 $PATH 변수가 다른 이유는 무엇입니까?

내가 디렉토리에 있고 경로를 에코할 때

pwd
/Users/me/src/some_proj

echo $PATH
/Users/me/.gem/ruby/2.0.0/bin:/opt/boxen/chruby/versions/2.0.0-
p353/lib/ruby/gems/2.0.0/bin:/opt/boxen/chruby/versions/2.0.0-
p353/bin:bin:/opt/boxen/chruby/bin:/opt/boxen/ruby-
build/bin:node_modules/.bin:/opt/boxen/nodenv/shims:/opt/boxen/nodenv/bin:
/opt/boxen/bin:/opt/boxen/homebrew/bin:/opt/boxen/homebrew/sbin:
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin

다른 디렉토리에 있고 경로를 에코할 때

pwd
/Users/me/src_personal/my_gems/som_gem

echo $PATH
bin:/opt/boxen/chruby/bin:/opt/boxen/ruby-build/bin:
node_modules/.bin:/opt/boxen/nodenv/shims:/opt/boxen/nodenv/bin:
/opt/boxen/bin:/opt/boxen/homebrew/bin:/opt/boxen/homebrew/sbin:
bin:/opt/boxen/chruby/bin:/opt/boxen/ruby-build/bin:
node_modules/.bin:/opt/boxen/nodenv/shims:/opt/boxen/nodenv/bin:
/opt/boxen/bin:/opt/boxen/homebrew/bin:/opt/boxen/homebrew/sbin:
bin:/opt/boxen/chruby/bin:/opt/boxen/ruby-build/bin:
node_modules/.bin:/opt/boxen/nodenv/shims:/opt/boxen/nodenv/bin:
/opt/boxen/bin:/opt/boxen/homebrew/bin:/opt/boxen/homebrew/sbin:
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin

다른 $PATH를 얻습니다. 나는 $PATH가 변경되지 않는 셸의 전역 변수라고 생각합니다. 이러한 경로가 디렉터리마다 다른 이유는 무엇입니까?

답변1

나는 이것이 오래된 질문이라는 것을 알고 있지만 최근에 일부 새로운 Ruby 사용자가 이 "분명히 불가능한" 동작을 경험했습니다. 이 문제가 발생한 다른 사람들을 돕기 위해 답변하고 있습니다.

이는 Ruby를 사용하고 있기 때문입니다. 디렉터리별로 로컬 번들 및 gem 설정을 적용하고 있습니다. 경로 변수변경은 cd 명령으로 인해 발생합니다. Ruby가 cwd 변경 사항을 처리하고 해당 대상 디렉터리에 대한 올바른 설정(또는 cwd에 구성되지 않은 경우 전역 설정)을 ENV에 적용하기 때문입니다.

매우 일반적인 시나리오는 Ruby 사용자가 분명히 PATH(번들이 시도되고 있는)에 있는 번들 명령을 실행하고 디렉터리를 변경한 다음 번들 명령을 알 수 없는 상태로 두는 것입니다(PATH에 이미 있기 때문에 더 이상 PATH에 없습니다). 한쪽으로 변경) cd 명령).

일반적으로 이 문제는 해당 디렉터리에 gem을 설치하면 해결됩니다.

답변2

셸에는 전역 변수가 없습니다. 즉, 서로 다른 인스턴스(프로세스) 간에 공유되는 변수입니다. 내보낸 변수는 하위 프로세스에 복사되지만 하위 프로세스가 시작될 때부터 독립적입니다.

관련 정보