source는 현재 셸에서 즉시 실행합니다
source ~/.bashrc는 현재 Bash에서 파일을 읽고 실행합니다. 정상적으로 실행된 대입이 적용되기 위해 재부팅할 필요는 없습니다. 기대한 값이 아니라면 조건문이나 중간의 return 때문에 그 줄을 지나지 않았는지, 뒤의 대입이 덮어썼는지 확인합니다.
source ~/.bashrc
printf '%s\n' "$PATH"
type -a ccbash ~/.bashrc처럼 실행하면 자식 Bash에서 설정합니다. 자식이 끝난 뒤 부모의 PATH는 바뀌지 않습니다. 이미 열려 있는 다른 터미널과 실행 중인 서비스에도 자동 반영되지 않습니다.
- source ./settings.sh현재 셸의 PATH를 변경합니다.
- bash ./settings.sh자식 셸의 PATH만 변경합니다.
두 상자는 순서도가 아니라 대안 비교입니다. source로 바꾼 환경은 그 이후 현재 셸에서 실행한 자식에게 전달됩니다.
Bash가 시작할 때 읽는 파일은 모드에 따라 다릅니다
| 일반적인 실행 형태 | 읽는 파일 |
|---|---|
| 로그인 셸 | /etc/profile 후 ~/.bash_profile, ~/.bash_login, ~/.profile 중 처음 발견한 읽기 가능한 파일 |
| 대화형 비로그인 셸 | ~/.bashrc |
| 보통의 비대화형 Bash 스크립트 | 설정되어 있으면 BASH_ENV가 가리키는 파일. .bashrc를 항상 읽는 것은 아닙니다. |
배포판의 전역 파일이나 사용자 profile이 다른 파일을 다시 읽을 수 있습니다. SSH 원격 실행, sh라는 이름으로 실행한 경우 등에는 추가 규칙이 있습니다. 현재 셸의 시작 방식과 실제 파일 내용을 함께 확인해야 합니다.
다시 읽어도 경로를 중복 추가하지 않게 합니다
add_to_path() {
[ -n "$1" ] || return 0
case ":$PATH:" in
*:"$1":*) ;;
*) PATH="${PATH:+$PATH:}$1" ;;
esac
export PATH
}
add_to_path "$HOME/.local/bin"| 코드 | 설명 |
|---|---|
[ -n "$1" ] | 빈 인자이면 아무 경로도 추가하지 않습니다. |
":$PATH:" | 양끝에도 구분자를 붙여 경로 한 항목 전체가 있는지 비교합니다. |
*:"$1":* | 같은 항목이 있으면 기존 값을 유지합니다. |
${PATH:+$PATH:} | 기존 PATH가 비어 있지 않을 때만 그 값과 콜론을 앞에 붙입니다. |
export PATH | 이후 실행할 프로그램의 환경에 전달합니다. |
이 예제는 뒤에 추가하므로 기존 경로의 명령이 우선합니다. 앞에 추가하면 같은 이름의 명령이 선택되는 순서도 바뀝니다. 콜론이 들어 있는 디렉터리는 PATH 항목으로 표현할 수 없습니다. 빈 PATH 항목은 현재 디렉터리를 뜻하므로 의도치 않게 넣지 않습니다.
$0와 BASH_SOURCE[0]도 구분합니다
bash script.sh로 실행한 스크립트에서 $0는 보통 script.sh입니다. 파일을 source한 경우에는 호출한 셸이나 스크립트의 $0가 유지됩니다. Bash의 ${BASH_SOURCE[0]}는 현재 실행 중인 코드가 정의된 파일을 확인할 때 유용합니다.
이 값이 반드시 절대 경로이거나 심벌릭 링크가 해제된 경로인 것은 아닙니다. 또한 BASH_SOURCE는 Bash 기능이므로 모든 /bin/sh에서 사용할 수 있는 문법으로 설명하면 안 됩니다.