Shell 스크립트를 실행하는 방법은 크게 네 가지로 나뉩니다. 각 방식은 현재 셸 환경에 미치는 영향이 다르므로 상황에 맞게 선택해야 합니다.
네 가지 실행 방식
bash ./script.sh./script.shsource ./script.sh. ./script.sh
실행 방식별 차이점
bash ./script.sh 방식은 현재 터미널에서 bash 하위 프로세스(subshell)를 생성하여 스크립트를 실행합니다. 따라서 현재 환경(예: 현재 디렉토리, 환경 변수)에 영향을 주지 않습니다.
[user@host ~]$ bash ./script.sh
./script.sh 방식은 스크립트 첫 줄에 선언된 shebang(#!/bin/bash 등)을 따라 해당 인터프리터의 하위 프로세스를 생성하여 실행합니다. 일반적으로 shebang이 bash라면 첫 번째 방식과 동일하게 동작합니다.
[user@host ~]$ ./script.sh
source ./script.sh와 . ./script.sh 방식은 현재 셸에서 직접 스크립트를 실행하므로 하위 프로세스를 생성하지 않습니다. 따라서 스크립트 내부의 변경사항(디렉토리 이동, 변수 할당 등)이 현재 셸 환경에 그대로 반영됩니다.
[user@host ~]$ source ./script.sh
[user@host ~]$ . ./script.sh
환경 영향 비교 실습
다음은 /tmp 디렉토리로 이동한 후 현재 경로를 출력하는 간단한 스크립트입니다.
#!/bin/bash
cd /tmp
pwd
방법 1: bash ./script.sh
스크립트에 실행 권한이 없어도 실행 가능합니다.
[user@host /]$ bash script.sh
/tmp
[user@host /]$ pwd
/
스크립트 종료 후에도 현재 디렉토리는 그대로 /입니다. 하위 프로세스에서만 /tmp로 이동했기 때문입니다.
방법 2: ./script.sh
먼저 실행 권한을 부여해야 합니다.
[user@host /]$ chmod u+x script.sh
[user@host /]$ ./script.sh
/tmp
[user@host /]$ pwd
/
결과는 방법 1과 동일하게 현재 환경에 영향을 주지 않습니다.
방법 3: source ./script.sh
[user@host /]$ source script.sh
/tmp
[user@host tmp]$ pwd
/tmp
현재 셸에서 직접 실행되었으므로 스크립트 종료 후에도 디렉토리가 /tmp로 변경된 상태가 유지됩니다.
방법 4: . ./script.sh
[user@host /]$ . ./script.sh
/tmp
[user@host tmp]$ pwd
/tmp
source의 단축형이며 동일한 결과를 보여줍니다.
핵심 정리
bash 또는 ./ 방식은 하위 프로세스(subshell)에서 스크립트를 실행하므로 현재 셸 환경에 영향을 주지 않습니다. 스크립트 종료 후 모든 변경사항은 사라집니다.
source 또는 . 방식은 현재 프로세스에서 스크립트를 실행하므로 디렉토리 변경, 변수 설정, 함수 정의 등이 현재 셸에 영구적으로 적용됩니다. 환경 설정 스크립트(.bashrc 등)를 적용할 때 주로 사용됩니다.