쉘 스크립트에서 .bashrc를 얻는 방법

쉘 스크립트에서 .bashrc를 얻는 방법

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 를 변경하지 않고 ~/.bashrcmy ~/.profile(다른 스크립트에서 호출됨) 에서 내 파일을 가져올 수 있습니까 ?~/.bashrc~/.profile

그러면 script.sh내 파일 ~/.profile~/.bashrc파일이 다운로드되어 올바른 위치에 저장됩니다. 따라서 script.sh다운로드한 후 내에서 이러한 파일을 가져와서 실행하는 데 사용하는 셸 세션에 영향을 주고 싶습니다.script.sh

답변1

오류는 이해하지 못하는 실행 ~/.profile파일을 사용하려고 할 때 발생합니다 ( 대신 다른 모든 POSIX 셸 에서도 작동하는 (점)을 사용하세요 ).shsourcesh.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얻었기 때문에 필요하지 않습니다.

관련 정보