스크립트 하단에 일부 행을 삽입하는 스크립트가 있습니다 . 스크립트가 완료된 후에도 이러한 변경 사항을 유지할 수 있도록 스크립트에서 이러한 행을 가져올 수 있는 .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/"에서 임시 파일을 삭제하는 파일을 생성할 수 있습니다. . d/" 또는 "~/.bashrc-temporary-addons".