2010-07-18 4 views
98

저는 bash 쉘 스크립팅을 처음 접했고 새로운 도전에 직면했습니다. 난 그냥 수행하여 내 "의 .profile"파일을 다시로드 할 수 있습니다 알고bash 쉘 스크립트의 .profile을 다시로드하십시오 (유닉스에서)?

. .profile 

그러나 나는 내가 쓰고 있어요 떠들썩한 파티 스크립트에서 동일한 작업을 수행하기 위해 노력하고있어 및 그냥 작동하지 않습니다. 아이디어가 있으십니까? 명확히하기 위해 내가 제공 할 수있는 것이 있습니까?

감사합니다.

+0

Ignacio가 아래에서 지적했듯이 스크립트는 서브 쉘에서 실행 중입니다. 서브 쉘은 메인 쉘을 수정할 수 없습니다 (하위 프로세스는 그 부모를 수정할 수 없습니다). 따라서 "."문자를 사용하여 스크립트를 "소스 화"해야합니다. 명령 ("소스"로 표기 할 수도 있음). 그러므로 스크립트가 환경 변수를 수정하고 싶다면 "소스 myscript"나 ".myscript"같은 것을해야합니다 (둘 다 똑같은 의미입니다). 이렇게하면 주 쉘의 환경이 수정됩니다. (내가 생각하는 것은 당신이하려고하는 것입니다, 이것이 틀렸다면 저에게 알려주세요.) – bstpierre

+1

질문에서 내 대답을 얻었습니다. –

답변

149

현재 쉘을 다시로드하려면이 시도 :

source ~/.profile 
3

bash 스크립트는 별도의 서브 쉘에서 실행됩니다. 이 작업을하려면이 다른 스크립트도 소스해야합니다.

+0

당신이 정확히 의미하는 것이 확실하지 않습니다 "소스"- 다른 스크립트. 조금이라도 확장 할 수 있었습니까? 그러나 나는 시도했다 : $. ~/.profile $./etc/profile 성공하지 못했습니다. 정말 고맙습니다. –

+1

@amirrustan : 스크립트는'.profile' 파일을 다음과 같이 소스 화해야합니다 :'. $ HOME/.profile' 그리고 당신은 그것을 소싱해서 스크립트를 시작해야 할 것입니다. '와 같은 것./path/to/yourscript' –

+1

@amirrustam http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a-bash-kr을 읽어주십시오. 스크립트/176788 # 176788 – lesmana

0

시도 :

#!/bin/bash 
# .... some previous code ... 
# help set exec | less 
set -- 1 2 3 4 5 # fake command line arguments 
exec bash --login -c ' 
echo $0 
echo [email protected] 
echo my script continues here 
' arg0 "[email protected]" 
6

이 시도 :/소스를 다시로드 할 때

cd 
source .bash_profile 
1

이 문제의 몇 발생할 ~ /.profile 파일. [이 우분투 리눅스를 의미 - 어떤 경우에는 명령의 세부 사항이 다를 수 있습니다]

  1. 이 직접 터미널이나 스크립트에서이 작업을 실행하고 있습니까?
  2. 스크립트에서 어떻게 실행합니까?

광고. 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 행운을 빌어 요!