사용자 정의 환경 변수를 사용하여 다른 프로그램을 실행하기 위해 bash 스크립트를 만들었습니다. 이것은 내 첫 번째 스크립트입니다 run-hello.sh
./home/user
#!/bin/bash
export PATH=$PATH":/home/user/cool/path"
hello.sh
exit 0
나는 스크립트를 /home/user/cool/path
가지고 있습니다 hello.sh
:
#\!/bin/bash
echo Hello from $(pwd)
첫 번째 스크립트(run-hello.sh)를 실행하면 다음이 생성됩니다.
Hello from /home/user
내 질문:
첫 번째 스크립트의 호출은
export
스크립트가 활성화된 동안에만 작동합니까? 스크립트를 실행한 후echo $PATH
스크립트에 의해 추가된 경로가 표시되지 않는 경우... 이는 예상된 동작입니까? 적어도 터미널 기간 동안 존재하도록 하려면 어떻게 해야 합니까?결과가
/home/user
대신 인쇄되는 이유는 무엇입니까/home/user/cool/path
?
답변1
먼저, 쉘 아래에서 쉘 스크립트를 시작할 때 쉘이 스크립트의 명령을 실행하기 위해 새 쉘(서브쉘이라고 함)을 생성한다는 점을 고려해야 합니다.
그런 다음 man bash는 다음과 같이 말합니다.
환경
프로그램이 호출되면 환경이라는 문자열 배열이 제공됩니다. 이는 형식의 이름-값 쌍 목록입니다name=value
.셸은 환경을 운영하기 위한 다양한 방법을 제공합니다. 호출되면 쉘은 환경을 스캔하고 발견된 각 이름에 대한 인수를 생성하여 자동으로 하위 프로세스로 내보낼 수 있도록 표시합니다. 실행된 명령은 환경을 상속합니다.
export
명령을 사용 하면declare -x
환경에서 매개변수와 기능을 추가하고 제거할 수 있습니다. 환경의 매개변수 값이 수정되면 새 값이 환경의 일부가 되어 이전 값을 대체합니다. 실행된 명령에 의해 상속된 환경은 쉘에서 수정될 수 있는 값에서 명령으로 제거된 쌍unset
과export
및 명령으로declare -x
추가된 모든 항목 을 뺀 쉘의 초기 환경으로 구성됩니다 .
따라서 처음으로 내보낼 때 PATH
새 값은 하위 쉘 환경의 일부가 되며 트리거되는 모든 하위 프로세스에서 사용할 수 있습니다. (예: hello.sh)
따라서 echo $PATH
hello.sh를 실행한 후 바로 실행하면 업데이트된 값이 표시되어야 합니다.
그러나 쉘을 종료합니다.! (run-hello.sh를 실행하는 하위 쉘이 종료됩니다.) 일부 조상(run-hello.sh를 시작한 쉘일 가능성이 높습니다)은 run-hello.sh 환경의 간섭을 전혀 인식하지 못한 채 제어권을 되찾았습니다.
그렇습니다. 이는 실제로 예상되는 동작입니다.
작업이 시작될 때 현재 작업 디렉터리는 이제 상위 디렉터리에서 상속됩니다. 프로그램이 위치한 디렉터리로 자동으로 변경되지 않습니다. 그래서 나는 당신의 전화가 그 전화번호부에서 걸려온
것이라고 의심해야 합니다 .run-hello.sh
/home/user
요약하자면, 내보낸 변수의 수명은 내보내기를 담당하는 작업의 수명과 동일하며 작업 자체와 해당 하위 항목(시작 시)의 유효성이 보장됩니다.