쉘이 PATH 및 $PATH를 처리하는 방법을 이해하지 못합니다. 다음을 고려하세요:alias testCMD=PATH=$PATH
나는 뛸 수 있습니다
$ testCMD vim
하지만 선언하면 작동하지 않습니다.alias testCMD=$PATH
나는 또한 달릴 수 없습니다:
$ PATH vim
또는
$ $PATH vim
이는 다른 별칭이 작동하는 방식에 비해 약간 반직관적입니다. 내 혼란을 이해해 주시기 바랍니다.
답변1
쉘에는 다음과 같은 다양한 항목이 저장됩니다.환경 변수. PATH는 이러한 환경 변수 중 하나의 예일 뿐입니다.
PATH 변수가 설정되지 않은 경우 실행되는 각 프로그램의 전체 경로를 수동으로 설정해야 합니다. 예를 들어, 그냥 실행할 수는 없으며 매번 실행 date
해야 합니다 . /usr/bin/date
나중에 에서 Date의 사용자 정의 버전을 설치하는 경우 /usr/local/bin/
로 실행해야 합니다 /usr/local/bin/date
.
불편하기는 하지만 불가능한 것은 아니므로 실제로 PATH는 선택 사항임을 알 수 있습니다. 따라서 PATH의 역할은 단순히 프로그램의 위치를 자동으로 감지하는 것입니다.
프로그램은 시스템의 여러 위치에 있을 수 있으므로 PATH는 단순한 디렉토리 그 이상입니다. 대신 콜론으로 구분된 디렉터리 목록입니다. 셸에서 명령을 실행하면 셸은 실행하려는 명령을 찾기 위해 이러한 디렉터리를 검색합니다.
예시 로 돌아가서 에서 맞춤설정 도구의 우선순위를 정할지 여부를 date
설정 하고 그렇지 않은 경우 대체 할 수 있습니다 . 그런 다음 를 실행하면 셸이 PATH 목록의 앞부분에 표시되므로 해당 셸을 제거해 도 PATH에서 두 번째이기 때문에 해당 셸을 계속 찾을 수 있습니다 .PATH=/usr/local/bin:/usr/bin
/usr/local/bin
/usr/bin
/usr/local/bin
date
/usr/local/bin/
/usr/local/bin/date
/usr/local/bin/date
/usr/bin/date
/usr/bin/
이를 실행하면 alias testCMD=PATH=$PATH
다음과 같은 별칭을 얻게 됩니다.
testCMD='PATH=.:/usr/local/bin:/usr/bin:/bin'
따라서 를 실행할 때 testCMD vim
쉘이 보는 것은 다음과 같습니다.
PATH=.:/usr/local/bin:/usr/bin:/bin vim
이는 쉘에 어디를 봐야 하는지 알려주는 일회성 지침을 제공할 뿐입니다 vim
. 방금 실행한 경우 vim
testCMD 별칭이 PATH 값을 변경하지 않기 때문에 동일한 결과를 얻을 수 있습니다.
PATH를 변경하면 다음과 같은 차이점이 있습니다.
$ PATH=/foo vim
bash: vim: command not found
쉘이 이름이 지정된 일부 디렉토리를 찾으려고 시도하지만 /foo
확실히 거기에 없기 때문입니다.vim
작동하지 않는 예제로 이동하면 변수 할당을 수행하지 않았기 때문입니다. PATH=/foo vim
와 사이에는 차이가 있습니다 PATH vim
. 에서 PATH vim
쉘은 사용자가 이라는 프로그램을 찾으려고 한다고 생각합니다 PATH
. 그런 다음 쉘은 각 디렉토리에서 $PATH
이름이 지정된 프로그램을 찾습니다 PATH
. (아마도) 이러한 디렉토리에 PATH 명령이 없기 때문에 다음과 같은 결과를 얻을 수 있습니다.
$ PATH vim
bash: PATH: command not found
vim
값을 접두어로 사용하는 경우에도 동일한 원칙이 적용됩니다 $PATH
. 할당이 없으므로 쉘은 $PATH
이를 일부 프로그램의 이름이라고 생각합니다. 이것이 바로 당신이 얻는 이유입니다:
$ $PATH vim
bash: .:/usr/local/bin:/usr/bin:/bin: No such file or directory
일반적으로 또는 ~/.bashrc
다양한 ~/.bash_profile
툴체인 간에 전환하려는 경우는 예외입니다. 이것이 실제로 Python virtualenvs의 목적이며 자동으로 PATH를 재구성합니다. 환경 모듈 시스템, 예:왼쪽 금형필요할 때 PATH를 조작하는 또 다른 강력한 방법입니다.