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

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

내 의 맨 아래에 몇 줄을 삽입하는 스크립트가 있습니다 . 스크립트가 완료된 후에도 이러한 변경 사항이 유지되도록 스크립트 내에서 .bashrc소스를 제공할 수 있는 방법이 있습니까 ? .bashrc다음은 유사한 스크립트의 MWE입니다.

#!/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/" 또는 "~/.bashrc-temporary-addons".

관련 정보