두 디렉토리 사이에서 $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 사용자가 이 "분명히 불가능한" 동작을 경험했습니다. 이 문제를 겪은 다른 사람들을 돕기 위해 답변하고 있습니다.

각 디렉토리에 로컬 번들 및 gem 설정을 적용하는 Ruby를 사용하고 있기 때문입니다. PATH 변수~이다단순히 cd 명령으로 인해 변경 - Ruby가 cwd 변경을 처리하고 해당 대상 디렉터리에 대한 올바른 설정(또는 cwd에 구성이 없는 경우 전역 설정)을 ENV에 적용하기 때문입니다.

매우 일반적인 시나리오는 Ruby 사용자가 PATH에 있는 번들 명령을 실행하고(어떤 번들을 시도) 디렉터리를 변경한 다음 번들 명령을 알 수 없게 만드는 것입니다(PATH가 측면으로 변경되었기 때문에 더 이상 PATH에 없습니다). cd 명령의 효과).

일반적으로 이 문제는 문제가 있는 디렉터리에 gem을 설치하면 해결될 수 있습니다.

답변2

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

관련 정보