ENV 변수를 변경하고 동일한 명령에 이를 반영할 때 새 값이 표시되지 않는 이유는 무엇입니까? [복사]

ENV 변수를 변경하고 동일한 명령에 이를 반영할 때 새 값이 표시되지 않는 이유는 무엇입니까? [복사]

실행하면 대신 PATH=abc:$PATH echo $PATH이전 값을 얻습니다 .PATHabc:PATH

왜 이런거야? 어떻게 얻을 수 있나요 abc:$PATH?

PATH=/mybin:$PATH which python편집: /mybinPython 실행 파일이 있으면 어떻게 되나요?

답변1

당신이 달릴 때

PATH=abc:$PATH echo $PATH

또는 보다 일반적인 경우에는

variable=value utility

그런 다음 variable환경에서 설정합니다 utility(현재 환경에서는 설정하지 않음).

그러나 명령줄을 구문 분석하면 변수 값이 PATH다음과 같이 변경됩니다.현재의환경.

변수가 확장된 환경에서 변수를 설정해야 합니다. 다음과 같이 두 단계로 나누어 이 작업을 수행할 수 있습니다.

PATH=abc:$PATH; echo "$PATH"

이는 PATH현재 환경에서 설정되며,그 다음에echo "$PATH"아래와 같이 실행 하거나 서브셸에 대한 변수를 설정합니다.

PATH=abc:$PATH sh -c 'echo "$PATH"'

PATH이렇게 하면 변수가 에 설정되지만 sh -c현재 셸에는 설정되지 않습니다.

두 번째 예에서는

PATH=/mybin:$PATH which python

유틸리티 는 which해당 환경에서 수정한 이후 python발견되었다고 말할 수 있습니다. 현재 환경에서는 여기가 확장되지 않았지만 ./mybinPATHPATHwhich

그나저나, which python더 잘 작성되었습니다(더 이식 가능) command -v python(" 참조)." which "를 사용하지 않는 이유는 무엇입니까? 그러면 무엇을 사용해야 합니까?").


ENV" 변수" 라고 부르는 제목을 간단히 생각해 보세요 . 이 ENV변수는 의도한 바는 아니지만 sh일부 구현(및 일부 다른 셸)에서 사용되는 환경 변수입니다. 해당 값이 파일 이름이면 대화형 셸 세션을 시작하기 전에 파일을 가져옵니다. 비대화형 쉘에 대해 동일한 방식으로 작동하는 변수가 bash있습니다 .BASH_ENV

답변2

그 이유는 echo $PATH수정된 환경이 만들어지기 전에 확장이 일어나기 때문이다.

다음으로 전화해 보세요.

PATH=abc:$PATH env

실제로 명령 환경이 수정된 것을 확인할 수 있습니다.

에코 매개변수의 확장으로 인해

PATH=abc:$PATH echo $PATH

새 환경을 설정하기 전에 발생하는 상황이므로 이를 두 개의 명령으로 분할해야 합니다.

(PATH=abc:$PATH; echo $PATH)

당신이 좋아하는 일을 하세요. echo명령 수명이 유지 되도록 환경 변경을 방지하려면 하위 셸()이 필요합니다 .

답변3

현재 셸 대신 하위 셸에서 대체를 수행합니다.

PATH=abc:$PATH sh -c 'echo $PATH'

관련 정보