Bash 5.x · 배포판별 초기화 파일 차이 있음

설정을 바꿨는데 PATH가 그대로인 이유

source, 로그인 셸, 대화형 셸이 설정을 읽는 시점을 구분하고 PATH 중복을 줄입니다.

source는 현재 셸에서 즉시 실행합니다

source ~/.bashrc는 현재 Bash에서 파일을 읽고 실행합니다. 정상적으로 실행된 대입이 적용되기 위해 재부팅할 필요는 없습니다. 기대한 값이 아니라면 조건문이나 중간의 return 때문에 그 줄을 지나지 않았는지, 뒤의 대입이 덮어썼는지 확인합니다.

source ~/.bashrc
printf '%s\n' "$PATH"
type -a cc

bash ~/.bashrc처럼 실행하면 자식 Bash에서 설정합니다. 자식이 끝난 뒤 부모의 PATH는 바뀌지 않습니다. 이미 열려 있는 다른 터미널과 실행 중인 서비스에도 자동 반영되지 않습니다.

설정 파일을 실행하는 두 방법
  1. source ./settings.sh현재 셸의 PATH를 변경합니다.
  2. 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에서 사용할 수 있는 문법으로 설명하면 안 됩니다.

확인한 문서

Bash 5.x · 배포판별 초기화 파일 차이 있음