zsh에서 PATH 변수를 변경하고 싶습니다.
.zshrc
문제: 파일의 어느 부분을 수정해야 하는지 모르겠습니다 .
일반적으로 저는 PATH 변수 할당을 찾아 처음부터 원하는 값을 설정합니다(모든 시스템 바이너리 디렉터리는 변경되지 않은 채로 둡니다).
내 .zshrc 파일의 첫 번째 줄은 다음과 같습니다.
# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH
# Path to your oh-my-zsh installation.
export ZSH="/Users/Sam/oh-my-zsh"
export PATH=$PATH:/Applications/Postgres.app/Contents/Versions/13/bin
등.
내 실제 PATH 변수는 다음과 같습니다
/Library/Frameworks/Python.framework/Versions/3.9/bin:/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Postgres.app/Contents/Versions/13/bin
python3.8이 있는 디렉토리를 삭제하고 싶습니다. 중복됩니다.
내 질문:
- .zshrc 파일에서 라인 2 또는 7을 변경해야 합니까?
- 2행은 주석 처리되어 있습니다. 터미널이 시작될 때 실행됩니까?
- 7행을 주석 처리해 보았습니다. 그러나 postgres 디렉토리는 여전히 내 PATH 변수에 남아 있는데, 이는 이해할 수 없습니다.
답변1
댓글에서 답변으로 다시 게시했지만 몇 가지 추가 메모가 있습니다.
먼저 웹에서 Un*x 셸(명령줄) 및 터미널 세션 사용에 대한 소개 가이드를 검색하세요. 대부분은 PATH와 같은 가장 일반적인 환경 변수에 대한 광범위한 정보를 제공합니다. (어떤 사람들은 자세한 내용을 제공하지 않을 수도 있습니다.많은 장소그러나 PATH 변수는 설정/수정/등입니다. )
둘째, 환경 변수가인스턴스당이는 각 프로세스가 시작될 때 (상위 프로세스로부터) 자체 변수 복사본을 가져오고"글로벌 환경"이라는 것은 없습니다. 두 개의 터미널 인스턴스를 열고 한 터미널에 를 입력하고 export PATH=""
PATH 변수를 지운 다음 다른 터미널에 입력하면 이를 확인할 수 있습니다 echo $PATH
. 두 번째에는 PATH 변수가 표시됩니다.영향을받지 않았다첫 번째 터미널 창에서 정리를 진행합니다.
셋째, 질문이 전부가 아닌 이상 하나의 질문에 여러 질문을 하지 않도록 하십시오.매우밀접하게 관련.
나는 질문들 사이를 앞뒤로 이동할 것입니다(그 질문들은 매우 밀접하게 관련되어 있기 때문입니다). 또한 bash
구문/명령을 많이 사용합니다. 다른 쉘은 다른 형식(예: )을 사용할 수 setvar
있습니다 tcsh
.
당신의기본 .zshrc
사용자 홈 디렉터리($HOME)를 생성할 때 뼈대(템플릿) 파일에서 복사합니다(일반적으로 사용자 레코드를 생성할 때). 시스템 관리자가 skel 파일을 수정하면 새 버전이아니요이미 존재하는 홈 디렉토리에 복사하세요! ). 이러한 뼈대 파일은 일반적으로 /etc/skel
다음과 같은 위치 에 있습니다 .가능한특정 쉘에 대해 정의되거나 시스템 관리자가 정의합니다.
이러한 기본/프레임워크 파일에는 일반적으로 일반적인 사용법의 예가 포함되어 있으며 때로는 주석 처리되어("#" 접두사) 사용자의 홈 디렉터리에서 편집할 때 원하거나 필요에 따라 주석 처리를 제거하거나 편집할 수 있습니다.
이러한 파일이 모두 자동으로 로드되는 것은 아닙니다. "로그인"할 때만 로드됩니다. 일부는 GUI를 통해 로그인할 때만 로드할 수 있고, 다른 일부는 텍스트 모드 콘솔에 로그인할 때만 로드할 수 있습니다. 일반적으로 다른 쉘은 해당 쉘에 로그인/시작할 때 기본 구성을 정의하기 위해 .<shell>rc
, .bashrc
또는 (종종 "rc 파일"로 단축됨) 과 같은 이름을 사용합니다 . .zshrc
이것이 무엇을 의미하는지 특별히 주의하세요.어느셸과 해당 rc 파일을 로드하지 않는 cron 작업이나 GUI 실행 프로그램과 같은 프로그램에서 프로세스를 실행하는 경우 rc 파일에 설정된 명령이나 변수를 사용할 수 없습니다.
또한 쉘이 수행한다는 점을 명심하십시오.아니요자동으로새로고침rc 파일을 편집할 때마다. 편집한 후 "다시 로드"하려면 쉘/터미널을 닫거나/종료하고 다시 로그인해야 합니다 source .zshrc
. source .bashrc
일부 쉘은 강제로 세션을 다시 로드할 수 있습니다. 이를 수행하는 방법에 대한 자세한 내용은 쉘의 매뉴얼 페이지를 읽어야 합니다.
이 방법을 사용할 때에는 source .zshrc
이전 설정과 값이 유지된다는 점도 기억해야 합니다. 이는 rc 파일이 PATH 변수를 명시적으로 지우지 않는 한 이전 값을 계속 포함하고다음에 추가rc 파일 - 이전에 로드된 rc 파일이 추가된 경우에도 마찬가지입니다. 예를 들어 "growvar.sh"라는 파일에 다음 코드를 입력합니다.
export GROWVAR="$GROWVAR:Grow!"
echo "GROWVAR now contains \"$GROWVAR\""
그리고 저장하세요. 그런 다음 다음 명령과 결과를 기록해 두십시오.
$ source growvar.sh
GROWVAR now contains ":Grow!"
$ source growvar.sh
GROWVAR now contains ":Grow!:Grow!"
$ source growvar.sh
GROWVAR now contains ":Grow!:Grow!:Grow!"
(또한 이 작업을 수행해야 합니다 source
. 파일을 실행 가능하게 만드는 것( chmod +x ...
)은 부모 쉘 프로세스 환경에 영향을 주지 않고 하위 쉘에서 "실행"되기 때문에 예상한 대로 작동하지 않습니다.)
대부분의 쉘은 이미 검사한 $PATH의 모든 부분 검사를 건너뛰기 때문에 일반적으로 PATH에는 무해합니다. 또한 "::"와 같은 "빈" 경로도 무시합니다(실제로는삼":"로 구분된 빈 경로입니다. 이것이 $PATH가 이전에 설정되지 않은 경우에도 `export PATH="$PATH:/new/path/here"가 여전히 작동하는 이유입니다. 그러나 PATH 변수에 긴 경로를 많이 추가하면 여러 개의 중복 경로로 인해 변수가 매우 커질 수 있습니다. (사용 가능한 환경 공간 메모리가 소진될 수도 있습니다.)
뭔가 잊고 있는 게 확실합니다... 하지만 이것이 연결되는 방식입니다.
질문 #1: 라인 #7을 변경하세요. 아니면... 주석 처리하고 "수정된" 버전을 추가하세요. 이렇게 하면 변경한 내용, 이전 내용, 이후 내용을 나중에 즉시 확인할 수 있습니다. 스켈레톤 파일의 주석 처리된 "예제" 코드에 대해서도 동일한 작업을 수행합니다. 주석 처리를 제거하지 마십시오. 코드를 복사하고 원하는 대로 조정한 다음 복사본의 주석 처리를 제거하십시오.
문제 #2: 위에서 언급한 것처럼 "#"은 해당 행을 주석 행으로 만들고 쉘은 이를 무시합니다.
질문 #3: 아마도 rc 파일을 변경하면 자동으로 파일이 다시 로드될 것이라고 예상할 것입니다(위에서 그렇게 하지 않는다고 설명했습니다). 또는 ( 명령을 통해 source
) 다시 로드하면 PATH 장차 ~ 가 되는분명한현재 가치(위에서도 설명했지만 사실은 아닙니다). 변경 사항을 적용하려면 셸을 완전히 다시 시작하거나 다시 로드해야 합니다.
질문(의견에서) #1: "$PATH는 어디서 가져오나요?" 처음에는 PATH가 존재하지도 않았습니다. $PATH에서와 같이 이를 참조하려고 하면 빈 문자열("")만 반환됩니다. 쉘에 로그인하면 쉘은 source
일반적으로 나중에 사용할 수 있도록 PATH 변수를 설정하는 여러 시스템 기본 파일을 자동으로 생성합니다 /etc/default
(다른 위치 중에서 쉘의 매뉴얼 페이지에 쉘에 대한 세부 정보가 제공됨). 그러므로최대예제 PATH 설정이 사용되어 export PATH="$PATH:/new/path/here"
이전에 설정된 경로를 유지합니다(또는 PATH가 이전에 존재하지 않는 경우 전혀 유지하지 않습니다).
질문(의견에서) #2: "$HOME/bin"에 관한 샘플 라인: 숙련된 많은 Un*x 사용자는 자신의 로그인에 특정한 사용자 정의 명령과 재정의를 제공하기 위해 자신만의 $HOME/bin 디렉토리를 가지고 있습니다. 따라서 예제 구성 줄에서는 디렉터리를 PATH에 추가하여 이를 보여줍니다. 존재하지 않는 PATH 변수의 모든 디렉터리는 무시되고 오류 없이 건너뜁니다.
추가하도록 편집됨: 아, 그리고... $HOME이 정의되지 않은 극단적인 경우에는 PATH와 같은 빈 문자열로 대체됩니다. 따라서 "$HOME/bin"은 "/bin"으로 평가됩니다.
또 다른 "추가를 위한 편집" 기능이 도움이 될 수 있습니다. 단순히 PATH를 정리하는 것이 목표인 경우 이를 수행하기 위한 간단한 유틸리티를 작성할 수 있습니다. 그러나 이 유틸리티는 자체 PATH 복사본만 수정할 수 있다는 점을 기억해야 합니다. 새 경로를 설정하기 위해 상위 프로세스/셸에서 읽을 수 있는 삭제된 경로를 유틸리티 출력(표준 출력)으로 설정하여 이 문제를 해결할 수 있습니다. 예를 들어:
...
export PATH=`/bin/mypathutil --cleanup`
...
/bin/cleanpath
실제로 각 디렉토리가 한 번만 제공되는 경로를 출력하는 TCL 스크립트가 있습니다 . 따라서 "/bin:/bin:/usr/bin:/bin:/usr/bin:/usr/games:/bin:/bin"과 같은 명령은 단순히 "/bin:/usr/bin: usr/games"를 출력합니다. . (기술적으로 내 스크립트는 그 이상의 기능을 수행합니다. 예를 들어 내 특수 사용자 정의 디렉토리가 /usr/local/overrides
항상 PATH의 첫 번째에 있도록 하여 항상 거기에서 사용자 정의 명령을 무시할 수 있도록 합니다. 이 방법으로 /usr/ local에 심볼릭 링크를 생성하여 특정 명령을 일시적으로 비활성화할 수도 있습니다. /override는 /bin/true
.(그러나 쉘 내장 또는 실행 파일의 전체 경로 이름을 사용하는 프로그램에서는 작동하지 않을 수 있습니다...)