Bash 스크립트에서 내보낸 변수의 수명 주기 및 유효성

Bash 스크립트에서 내보낸 변수의 수명 주기 및 유효성

사용자 정의 환경 변수를 사용하여 다른 프로그램을 실행하기 위해 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

내 질문:

  1. 첫 번째 스크립트의 호출은 export스크립트가 활성화된 동안에만 작동합니까? 스크립트를 실행한 후 echo $PATH스크립트에 의해 추가된 경로가 표시되지 않는 경우... 이는 예상된 동작입니까? 적어도 터미널 기간 동안 존재하도록 하려면 어떻게 해야 합니까?

  2. 결과가 /home/user대신 인쇄되는 이유는 무엇입니까 /home/user/cool/path?

답변1

먼저, 쉘 아래에서 쉘 스크립트를 시작할 때 쉘이 스크립트의 명령을 실행하기 위해 새 쉘(서브쉘이라고 함)을 생성한다는 점을 고려해야 합니다.

그런 다음 man bash는 다음과 같이 말합니다.

환경
프로그램이 호출되면 환경이라는 문자열 배열이 제공됩니다. 이는 형식의 이름-값 쌍 목록입니다 name=value.

셸은 환경을 운영하기 위한 다양한 방법을 제공합니다. 호출되면 쉘은 환경을 스캔하고 발견된 각 이름에 대한 인수를 생성하여 자동으로 하위 프로세스로 내보낼 수 있도록 표시합니다. 실행된 명령은 환경을 상속합니다. export 명령을 사용 하면 declare -x 환경에서 매개변수와 기능을 추가하고 제거할 수 있습니다. 환경의 매개변수 값이 수정되면 새 값이 환경의 일부가 되어 이전 값을 대체합니다. 실행된 명령에 의해 상속된 환경은 쉘에서 수정될 수 있는 값에서 명령으로 제거된 쌍 unsetexport및 명령으로 declare -x추가된 모든 항목 을 뺀 쉘의 초기 환경으로 구성됩니다 .

따라서 처음으로 내보낼 때 PATH새 값은 하위 쉘 환경의 일부가 되며 트리거되는 모든 하위 프로세스에서 사용할 수 있습니다. (예: hello.sh)
따라서 echo $PATHhello.sh를 실행한 후 바로 실행하면 업데이트된 값이 표시되어야 합니다.

그러나 쉘을 종료합니다.! (run-hello.sh를 실행하는 하위 쉘이 종료됩니다.) 일부 조상(run-hello.sh를 시작한 쉘일 가능성이 높습니다)은 run-hello.sh 환경의 간섭을 전혀 인식하지 못한 채 제어권을 되찾았습니다.

그렇습니다. 이는 실제로 예상되는 동작입니다.

작업이 시작될 때 현재 작업 디렉터리는 이제 상위 디렉터리에서 상속됩니다. 프로그램이 위치한 디렉터리로 자동으로 변경되지 않습니다. 그래서 나는 당신의 전화가 그 전화번호부에서 걸려온
것이라고 의심해야 합니다 .run-hello.sh/home/user

요약하자면, 내보낸 변수의 수명은 내보내기를 담당하는 작업의 수명과 동일하며 작업 자체와 해당 하위 항목(시작 시)의 유효성이 보장됩니다.

관련 정보