내 의 맨 아래에 몇 줄을 삽입하는 스크립트가 있습니다 . 스크립트가 완료된 후에도 이러한 변경 사항이 유지되도록 스크립트 내에서 .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".