이 문제의 몇 발생할 ~ /.profile 파일. [이 우분투 리눅스를 의미 - 어떤 경우에는 명령의 세부 사항이 다를 수 있습니다]
- 이 직접 터미널이나 스크립트에서이 작업을 실행하고 있습니까?
- 스크립트에서 어떻게 실행합니까?
광고. 1)
터미널에서 직접 실행한다는 것은 서브 쉘이 생성되지 않는다는 것을 의미합니다. 그래서 당신은 사용할 수 있습니다 두 가지 명령 : 두 경우 모두
source ~/.bash_profile
또는
. ~/.bash_profile
이는 .profile 파일의 내용으로 환경을 업데이트합니다.
광고 2) 당신도이의 환경 변수에 영향을 미치지 않습니다 서브 쉘을 생성합니다 첫 번째 경우
sh myscript.sh
또는
. myscript.sh
를 호출하여 어떤 bash는 스크립트를 시작할 수 있습니다 시스템에 저장되며 서브 쉘 프로세스에서만 볼 수 있습니다. 서브 쉘 명령을 완료 한 후에는 반출 등이 적용되지 않습니다. 이것은 일반적인 실수이며 많은 개발자가 많은 시간을 잃을 수 있습니다. 스크립트에 적용되는 변경 사항이 스크립트가
.myscript.sh
명령을 실행해야하는 지구 환경에 대한 영향을하기 위해서는
.
스크립트가 하위 쉘에서 실행되지 않도록이 기능을 사용할 수 있습니다. (다시 예제는 우분투 셸입니다)
#/bin/bash
preventSubshell(){
if [[ $_ != $0 ]]
then
echo "Script is being sourced"
else
echo "Script is a subshell - please run the script by invoking . script.sh command";
exit 1;
fi
}
나는 이것이 일반적인 오해 중 일부를 없애기를 희망합니다! : D 행운을 빌어 요!
Ignacio가 아래에서 지적했듯이 스크립트는 서브 쉘에서 실행 중입니다. 서브 쉘은 메인 쉘을 수정할 수 없습니다 (하위 프로세스는 그 부모를 수정할 수 없습니다). 따라서 "."문자를 사용하여 스크립트를 "소스 화"해야합니다. 명령 ("소스"로 표기 할 수도 있음). 그러므로 스크립트가 환경 변수를 수정하고 싶다면 "소스 myscript"나 ".myscript"같은 것을해야합니다 (둘 다 똑같은 의미입니다). 이렇게하면 주 쉘의 환경이 수정됩니다. (내가 생각하는 것은 당신이하려고하는 것입니다, 이것이 틀렸다면 저에게 알려주세요.) – bstpierre
질문에서 내 대답을 얻었습니다. –