$PATH 환경 변수를 설정하는 이유와 위치를 어떻게 알 수 있나요?

$PATH 환경 변수를 설정하는 이유와 위치를 어떻게 알 수 있나요?

저는 OSX에서 iterm2와 함께 zsh 버전 5.0.8을 사용하고 있습니다.

컴퓨터를 시작하고 변수를 printenv표시합니다 .$PATH

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin

내 이해에 따르면 zsh는 다음 파일을 순서대로 가져옵니다.

/etc/zshenv
~/.zshenv
/etc/zshrc
~/.zshrc

확인해 보니 처음 3개 파일이 없고 내 파일은 .zshrc기본적으로 비어 있고 $PATH 변수와 아무 관련이 없습니다.

그럼 변수는 어디에 설정되어 있나요 $PATH? ? ?

답변1

나는 말 그대로 오늘 이 문제로 어려움을 겪었습니다.

OS X Yosemite에서 PATH는 다소 우회적인 방식으로 구성됩니다.

나는 cremefraiche가 말했듯이 ZSH에 내장된 기능이 있고 $PATH다른 설정이 없으면 이를 사용하지만 이는 귀하의 소스가 아니라고 믿습니다. 먼저 /etc/paths디렉토리 목록이 포함된 파일이 있습니다 . 디렉토리를 포함하는 더 많은 파일이 있는 디렉토리도 있습니다 /etc/path.d. 프로그램은 /usr/libexec/path_helper이러한 디렉토리 목록을 가져와 기존 변수(있는 경우)와 병합하고 중복 항목을 제거한 다음 먼저 나열된 디렉토리 $PATH와 함께 결과를 출력합니다 ./etc/paths

직접 실행해봐도 아무런 해가 없습니다. 이것은 내 결과입니다.

$ /usr/libexec/path_helper 
PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/MacGPG2/bin:/Users/alan/.local/bin:/Users/alan/src/go/bin"; export PATH;

그 자체로는 아무것도 하지 않지만 내 컴퓨터에서 호출됩니다 /etc/zprofile.

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

Apple이 이 코드를 다른 버전의 OS X에서 약간 이동한 것으로 보이기 때문에 이는 컴퓨터에 따라 다를 수 있습니다.

목록은 다음과 같습니다모두OS X에서 ZSH가 읽은 파일(평가 순서):

  1. /etc/zshenv
  2. ~/.zshenv
  3. /etc/z프로필
  4. ~/.zprofile
  5. /etc/zshrc
  6. ~/.zshrc
  7. /etc/z로그인
  8. ~/.z로그인
  9. ~/.zlogout
  10. /etc/zlogout

이러한 파일 중 일부는 비대화형 쉘 스크립트로 실행될 때와 같은 특정 상황에서 평가되지 않지만 여기서는 이에 대해 논의하지 않겠습니다. 관심이 있다면 ZSH 매뉴얼 페이지에서 찾을 수 있습니다.

$ man zsh

/etc/zprofile달리고 있다는 점은 주목할 가치가 있습니다.뒤쪽에 ~/.zshenv이므로 ZSH 가이드에 따라 .zshenv로 설정하면 이 문제가 발생하면 이름을 변경하여 시스템을 더 빨리 설정하는 것이 $PATH좋습니다 .path_helper/etc/zprofile/etc/zshenv$PATH

답변2

이것은 언급 bash되었지만 .zsh

기본값은 다음과 같습니다.bash컴파일 타임에 결정됩니다. 시작 파일에서 수정될 수 있지만 시작 파일에는 설정되지 않습니다.

Fedora 및 Red Hat Enterprise Linux 실용 가이드: 제7판. p359.

편집하다

좀 더 자세히 조사한 결과 기본값이 PATH실제로 컴파일 중에 설정되고 다음에서 찾을 수 있다는 것을 발견했습니다.초기화 프로그램문서.

/* Set default path */
path    = (char **) zalloc(sizeof(*path) * 5);
path[0] = ztrdup("/bin");
path[1] = ztrdup("/usr/bin");
path[2] = ztrdup("/usr/ucb");
path[3] = ztrdup("/usr/local/bin");
path[4] = NULL;

편집 2:

나는 freenode에서 zsh IRC에 접속했고 개발자는 빌드 중에 PATH가 설정되었음을 모두 보여주는 네 가지 명령 목록을 제공할 수 있었습니다. 나는 이 명령을 확장 채팅에 게시했지만 X 시간이 지나면 명령이 손실될 것이라는 사실을 깨닫지 못했습니다. 직접 보고 싶다면 IRC 개발자에게 데모를 요청하세요.

관련 정보