`.bashrc`를 업데이트하고 다시 로드하세요.

`.bashrc`를 업데이트하고 다시 로드하세요.

스크립트 하단에 일부 행을 삽입하는 스크립트가 있습니다 . 스크립트가 완료된 후에도 이러한 변경 사항을 유지할 수 있도록 스크립트에서 이러한 행을 가져올 수 있는 .bashrc방법이 있습니까 ? .bashrcMWE와 같은 스크립트는 다음과 같습니다.

#!/bin/bash

echo "export MyDir='MyAnalysis'" >> ~/.bashrc
echo "alias llA='ll MyAnalysis'" >> ~/.bashrc

source ~/.bashrc

스크립트를 실행한 후 수동으로 가져오지 않는 한 파일을 사용할 수 MyDir없습니다 .llA.bashrc

답변1

간접적.

스크립트는 대화형 셸과 다른 프로세스에서 실행됩니다. 스크립트 셸이 환경에 적용한 모든 변경 사항은 스크립트 셸이 종료되면 손실됩니다.하위 프로세스는 상위 프로세스의 환경을 변경할 수 없습니다.

당신이 할 수 있는 일:

  • 이 스크립트는 .bashrc를 업데이트하고 다른 작업은 수행하지 않습니다. 스크립트가 성공적으로 완료되면 bashrc를 받게 됩니다.

    bash yourScript.bash && source .bashrc
    
  • 이 스크립트는 .bashrc를 업데이트하고인쇄source 명령: 다른 내용이 인쇄되지 않는지 확인하세요. 그런 다음 eval스크립트를 실행합니다.

    eval "$(bash yourScript.bash)"
    
  • 이 스크립트는 .bashrc를 업데이트하고반품그것이 무엇인지 인쇄하십시오. 당신은 그것을 평가합니다: 이것이 스크립트입니다

    #!/bin/bash
    exec > >(tee -a "$HOME/.bashrc")
    
    echo "export MyDir='MyAnalysis'"
    echo "alias llA='ll MyAnalysis'"
    

    그런 다음 다음과 같이 실행하십시오.

    eval "$(bash yourScript.bash)"
    
  • 업데이트하지 않음부모쉘이지만 bashrc를 읽으려면 새로운 대화형 쉘을 시작하십시오.

    #!/bin/bash
    {
        echo "export MyDir='MyAnalysis'"
        echo "alias llA='ll MyAnalysis'"
    } >> ~/.bashrc
    exec bash -i
    

    상위 셸은 업데이트되지 않습니다.


.bashrc 업데이트 코드를 다음으로 설정한 경우기능, 함수가 현재 셸에서 실행되기 때문에(기본적으로) 예상대로 작동합니다.

addMyAnalysis() {
    echo "export MyDir='MyAnalysis'" >> ~/.bashrc
    echo "alias llA='ll MyAnalysis'" >> ~/.bashrc
    source ~/.bashrc
}

또 다른 기술: "conf" 디렉토리를 생성합니다 $HOME/.bash.d. 내부에 bash 파일 쓰기

# this is "~/.bash.d/some_file.bash"
export MyDir='MyAnalysis'
alias llA='ll MyAnalysis'

그리고 .bashrc는 해당 디렉터리의 모든 bash 파일을 참조합니다.

if [[ -d ~/.bash.d ]]; then
    shopt -s nullglob
    for f in ~/.bash.d/*.bash; do
        source "$f"
    done
    shopt -u nullglob
fi

답변2

@glenn-jackman이 지적했듯이 소싱은 스크립트를 실행하는 하위 셸에서 발생하고 스크립트 끝에서는 소싱이 발생하지 않은 상위 ​​셸로 돌아가고 .bashrc가 다시 실행되지 않습니다. 이로 인해 상위 셸이 분리됩니다. 쉘과 서브쉘은 일반적인 보안 문제에서 비롯됩니다.

당신이 찾고 있는 것은 exec bash스크립트 내에 없지만 그룹화되어 있습니다.

bash your-script.sh && exec bash

이번 공연마치당신은 구매를 한 다음 구매한 껍데기에 머물게 됩니다. 물론바꾸다현재 셸은 새 셸과 함께 제공됩니다. 이 새 셸은 모든 (대화형) 셸처럼 시작됩니다. .bashrc를 실행하고 이제 변경 사항을 적용합니다. 시작하는 모든 새 셸/터미널에도 동일하게 적용됩니다.

스크립트 내에서 "exec bash"를 수행하면 스크립트가 실행 중인 하위 쉘이 대체되지만 여전히 하위 쉘입니다.

.bashrc에서 동적 및 임시 작업을 수행하는 것이 목표라면 언제든지 쉽게 삭제할 수 있는 별도의 파일을 변경하라는 @glenn-jackman의 제안을 고려해야 합니다. 이 목적을 위해 영구 회선을 가질 수도 있습니다

[ -f ~/.bashrc-temporary-addons ] && source ~/.bashrc-temporary-addons

.bashrc 끝에 다음을 수행하십시오 (! 만하나첫 번째 줄의 "">"에는 새 파일이 있습니다)

echo "" > ~/.bashrc-temporary-addons
echo "export MyDir='MyAnalysis'" >> ~/.bashrc-temporary-addons
echo "alias llA='ll MyAnalysis'" >> ~/.bashrc-temporary-addons

그리고 원하는 지점에서

rm ~/.bashrc-temporary-addons

("-f" 테스트로 인해 "~/.bashrc-temporary-addons"가 존재하지 않아도 오류가 발생하지 않습니다.)

.bashrc 작업이 세션 동안 지속되어야 하는 경우(예: 로그아웃할 때까지(다음 로그인 시 다시 나타나지 않음)) .bash_logout"bash.d/" 또는 "bash .d/"에서 임시 파일을 삭제하는 파일을 생성할 수 있습니다. . d/" 또는 "~/.bashrc-temporary-addons".

관련 정보