bash 쉘 스크립트에서 .profile을 다시로드 하시겠습니까?


130

쉘 스크립팅을 처음 접했고 도전을 겪었습니다. 다음을 수행하여 ".profile"파일을 다시로드 할 수 있음을 알고 있습니다.

. .profile

하지만 내가 쓰고있는 bash 스크립트에서 동일하게 실행하려고하는데 작동하지 않습니다. 어떤 아이디어? 명확히하기 위해 제공 할 수있는 것이 있습니까?

감사


Ignacio가 아래에서 지적한 것처럼 스크립트는 하위 셸에서 실행 중입니다. 서브 쉘은 기본 쉘을 수정할 수 없습니다 (자식 프로세스는 부모를 수정할 수 없습니다). 따라서 "."를 사용하여 스크립트를 "소스"해야합니다. 명령 ( "소스"라고도 함). 따라서 스크립트가 환경 변수를 수정하려면 "source myscript"또는 ". myscript"와 같은 작업을 수행해야합니다 (둘 다 동일한 것을 의미 함). 이것은 주 쉘 환경을 수정합니다. (내 생각에 당신이하려는 일이라고 생각합니다. 이것이 틀렸는 지 알려주십시오.)
bstpierre

1
귀하의 질문에 대한 답변을 받았습니다 :)
Kolob Canyon

답변:


195

현재 쉘을 다시로드하려면 다음을 시도하십시오.

source ~/.profile

1
대체 솔루션이 있습니까? source명령을 사용하면 파일이 스크립트로 실행 되기 때문에 ... 최악의 경우 누군가가 MyVar="$foo$MyVar"bash_profile 과 같은 변수 할당을 사용 source ~/.profile하면 최종 결과 MyVar="$foo$MyVar$MyVar"를 제공하므로 $MyVar나중에 잘못된 값을 갖습니다. (에 관계없이 잘못된 관행을 바로 대체 솔루션에 대한 문의)
제프리 Mvutu Mabilama


5

~ / .profile 파일을 다시로드 / 소스 할 때 몇 가지 문제가 발생합니다. [이것은 우분투 리눅스를 의미합니다-어떤 경우에는 명령의 세부 사항이 다를 수 있습니다]

  1. 터미널이나 스크립트에서 직접 실행합니까?
  2. 스크립트에서 이것을 어떻게 실행합니까?

기원 후. 1)

이것을 터미널에서 직접 실행하면 서브 쉘이 생성되지 않습니다. 따라서 두 가지 명령 중 하나를 사용할 수 있습니다.

source ~/.bash_profile

또는

. ~/.bash_profile

두 경우 모두 .profile 파일의 내용으로 환경을 업데이트합니다.

광고 2) 다음 중 하나를 호출하여 bash 스크립트를 시작할 수 있습니다

sh myscript.sh 

또는

. myscript.sh

첫 번째 경우 시스템의 환경 변수에 영향을 미치지 않는 서브 쉘을 작성하고 서브 쉘 프로세스에서만 볼 수 있습니다. 서브 쉘 명령을 완료 한 후에는 내보내기 등이 적용되지 않습니다. 이것은 일반적인 실수이며 많은 개발자가 많은 시간을 잃게 만듭니다.

스크립트에 적용된 변경 사항이 글로벌 환경에 영향을 미치려면 스크립트를 실행해야합니다.

.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 행운!


4

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


다른 스크립트를 "소스"로 정확히 무엇을 의미하는지 잘 모르겠습니다. 조금만 더 확장 해주세요. 그러나 나는 시도했다 : $. ~ / .profile $. 성공하지 못한 / etc / profile 정말 고맙습니다.
Amir Rustamzadeh

1
@amirrustan : 스크립트는 .profile다음과 같은 파일 을 소스로 제공해야 합니다 . $HOME/.profile. 또한 스크립트를 소싱하여 시작해야합니다. 다음과 같은 사항. /path/to/yourscript
추후 공지가있을 때까지 일시 중지되었습니다.

1
@amirrustam 읽어주십시오 superuser.com/questions/176783/…
lesmana

1

시험:

#!/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 $@
echo my script continues here
' arg0 "$@"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.