script.sh
다음 줄을 포함하는 bash 스크립트가 있습니다 .
sudo -u myusername sh ~/.profile
셸에서 호출할 수 있지만 source ~/.profile
스크립트에서는 작동하지 않지만 이 명령은 작동합니다. 현재 쉘이 내 내용을 읽도록 강제합니다.~/.profile
그러나 내 내용에는 ~/.profile
다음 줄이 포함되어 있습니다.
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
하지만 ~/.bashrc
이를 실행하면 script.sh
다음과 같은 오류가 발생합니다.
/home/username/.profile: 24: /home/username/.profile: source: not found
my 또는 my 를 변경하지 않고 ~/.bashrc
my ~/.profile
(다른 스크립트에서 호출됨) 에서 내 파일을 가져올 수 있습니까 ?~/.bashrc
~/.profile
그러면 script.sh
내 파일 ~/.profile
과 ~/.bashrc
파일이 다운로드되어 올바른 위치에 저장됩니다. 따라서 script.sh
다운로드한 후 내에서 이러한 파일을 가져와서 실행하는 데 사용하는 셸 세션에 영향을 주고 싶습니다.script.sh
답변1
오류는 이해하지 못하는 실행 ~/.profile
파일을 사용하려고 할 때 발생합니다 ( 대신 다른 모든 POSIX 셸 에서도 작동하는 (점)을 사용하세요 ).sh
source
sh
.
bash
또한 실행 시 ~/.profile
파일이 실행되는 셸에서 설정하는 환경 변수가 설정되지 않습니다. 이는 자체 하위 쉘에서 실행되기 때문입니다.
~/.profile
하위 쉘( 얻는 것이 아니라 실행할 때 얻는 것 )은 상위 쉘(스크립트를 실행하는 쉘)의 환경에 전혀 영향을 주지 않습니다. 따라서 파일에서 변수를 설정하지 않으면 ~/.profile
해당 변수가 스크립트에서 설정될 것이라고 기대할 수 없습니다.source
실행은 현재 셸의 하위 프로세스이므로 sudo source ~/.profile
여기서는 도움이 되지 않습니다 .sudo
관련 추가 정보:
~/.profile
대화형 셸( 소스 ~/.bashrc
코드를 얻은 곳)에서 실행되지 않는 스크립트에 대한 환경을 설정하려면 BASH_ENV
스크립트를 호출할 때 변수를 적절한 파일로 설정하세요. 이렇게 하면 제어권을 스크립트에 넘겨주기 전에 소스 코드가 파일로 만들어집니다 bash
.$BASH_ENV
예를 들어:
BASH_ENV="$HOME/.profile" "$HOME/scripts/myscript.sh"
이것은오직이는 스크립트가 비대화형 셸 세션(예: cron 작업)에서 호출되고 환경 변수 또는 소스 파일의 모든 파일을 설정하기 위해 액세스해야 하는 경우에 ~/.profile
필요합니다 ~/.profile
.
대화형 셸 세션에서는 BASH_ENV
변수를 이런 방식으로 설정할 필요가 없으며, 스크립트는 이러한 변수를 얻을 필요가 없거나 ~/.bashrc
이미 ~/.profile
얻었기 때문에 필요하지 않습니다.