답변:
쉘 스크립트는 자체 쉘 인스턴스에서 실행됩니다. 모든 변수 설정, 함수 정의 등은이 인스턴스 (및 자식)에만 영향을 주지만 호출 쉘에는 영향을 미치지 않으므로 스크립트가 끝난 후에 사라집니다.
반대로 source
명령은 새 셸 인스턴스를 시작하지 않지만 현재 셸을 사용하므로 변경 사항이 유지됩니다.
.bashrc를 읽을 수있는 바로 가기를 원한다면 쉘 스크립트 대신 쉘 함수 또는 별칭을 사용하십시오.
alias brc='source ~/.bashrc'
source ~/.bashrc
환경을 변경하려는 쉘에서 실행 해야합니다. 다른 프로세스에서 변경할 수 없습니다. 어쩌면 (전역 적으로)이 별명을 추가하는 것은 GUI 설치 프로세스의 일부일 수 있습니다.
당신은 .bashrc
일반적으로 시작한다 :
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
스크립트에는 PS1이 설정되어 있지 않기 때문에 (대화식이 아니기 때문에) 일찍 종료되기 때문에 경로를 재설정하지 않습니다. 시연하려면 스크립트를 수정하십시오.
#!/bin/bash
chmod a+x ~/.bashrc
PS1='$ '
source ~/.bashrc
이것은 이제 스크립트가 새로운 작업을 수행 할 수있게합니다 .bashrc
. 참고 : 스크립트가 종료되면 env는 스크립트를 시작하기 전의 상태로 설정됩니다. 다음에 터미널을 시작할 때 변경 사항이 반영됩니다.
.bashrc
가 더 안정적인 방법을 사용하여 쉘이 대화식인지 확인합니다. /etc/bash.bashrc
여전히 PS1 테스트가 있습니다.
시험:
exec bash
~ / .bashrc, ~ / .bash_aliases 등을 다시로드해야합니다.
source
않지만 변수를 파괴하여 사용자가 수동으로 설정 한 값을 원할 수도 있습니다.
exec bash
명령을 이해하는 방식은 여전히 이전과 동일한 bash 설정에 있습니까?
라비의 답변 을 보완하고 싶습니다 .
기본 ~/.bashrc
파일은 Ubuntu 18.04와 같은 단락으로 시작 하므로이 동작은 Ubuntu (및 아마도 가장 파생 된 배포판)에만 해당됩니다 .
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
비 대화식 쉘에서 파일이 실행중인 경우 파일 평가가 중지됩니다. 이는 모든 스크립트가 비 대화식 쉘에서 실행 되므로 이후 source
에이 속성을 상속하는 모든 파일 이기 때문에 스크립트의 경우입니다 .
eval
파헤 치다, 난도질하다내가 사용, 특히 우분투를 해결하기 위해 못생긴 해킹을 발견 eval
대신 source
:
eval "$(cat ~/.bashrc | tail -n +10)"
단순히 첫 번째 몇 줄을 건너 뛰고 ~/.bashrc
나머지는 평가하여 나머지는 평가하고 현재 실행을 수정합니다.
그것은 마법 번호이며 우분투 버전에서는 작동하지 않을 수 있습니다. 그러나 알려진 시스템에 대한 스크립트를 작성하는 경우 좋은 솔루션이 될 수 있습니다.
더 환상적인 솔루션은 정규식을 사용하여 평가를 중지하는 특정 비트를 대상으로 할 수 있습니다.
일부 시나리오에서 더 잘 작동하는 또 다른 대안은 shebang에 플래그를 추가하여 스크립트가 대화식 쉘에서 실행되도록하는 것입니다 .
#!/bin/bash -i
몇 가지 사항에 유의하십시오.
#!/usr/bin/env bash
양식을하지만이 방법 당신은 인수를 사용하여 쉘을 시작할 수 없습니다 .-i
자체 결과 집합을 사용할 수 있습니다. 그 중에서도 프로그램은 사용자 상호 작용을 요구하며 일반적으로 스크립트 용이 아닙니다. 예를 들어 deb
패키지를 설치 하면 dpkg configure
프롬프트 에서 스크립트가 중지 될 수 있습니다 .set -i
하고 set +i
와 내가 필요한 곳 끄기 기능을 설정하는 것이 아니라 이 작동하지 않습니다 .