실행 권한과 실행 방법
스크립트를 작성했다고 해서 바로 실행할 수 있는 것은 아닙니다. 리눅스는 파일마다 누가 읽고, 쓰고, 실행할 수 있는지 권한을 별도로 관리합니다. 그리고 스크립트를 실행하는 방법도 한 가지가 아닙니다. 어떤 방법을 고르느냐에 따라 동작 방식이 달라집니다.
chmod +x 와 실행 권한
PART 02에서 chmod 명령어를 다뤘습니다. 새로 만든 파일은 기본적으로 실행 권한이 없습니다.
$ ls -l scripts/greet.sh-rw-r--r-- 1 user user 312 Apr 24 10:00 scripts/greet.sh
맨 앞의 -rw-r--r--에서 x가 보이지 않습니다. 이 상태에서 ./greet.sh로 실행하려 하면 Permission denied 오류가 납니다.
실행 권한을 추가합니다.
chmod +x scripts/greet.sh
이제 파일 목록을 다시 확인하면 다음과 같이 바뀝니다.
$ ls -l scripts/greet.sh-rwxr-xr-x 1 user user 312 Apr 24 10:00 scripts/greet.sh
rwx에 x가 추가되었습니다. 본인에게만 실행 권한을 주고 싶다면 chmod u+x, 모든 사용자에게 주고 싶다면 chmod a+x를 사용합니다.
4가지 실행 방법
Bash 스크립트를 실행하는 방법은 네 가지입니다. 각각 동작 방식이 다릅니다.
방법 1. ./script.sh
./scripts/greet.sh
현재 디렉토리의 스크립트를 실행합니다. 셔뱅에 명시된 인터프리터(/bin/bash)가 실행을 담당합니다. 실행 권한(+x)이 반드시 있어야 합니다. 새로운 서브쉘(subprocess)을 만들어서 실행합니다.
방법 2. bash script.sh
bash scripts/greet.sh
bash 명령어를 명시적으로 지정해서 실행합니다. 실행 권한이 없어도 됩니다. 스크립트 개발 중에 자주 씁니다. 역시 서브쉘에서 실행됩니다.
방법 3. source script.sh
source scripts/greet.sh
현재 쉘 환경에서 직접 실행합니다. 서브쉘을 만들지 않습니다. 스크립트 안에서 선언한 변수나 함수가 현재 터미널 세션에 남습니다. .bashrc나 .bash_profile을 수정한 뒤 재적용할 때 쓰는 source ~/.bashrc가 이 방식입니다.
방법 4. . script.sh
. scripts/greet.sh
source의 단축 표현입니다. 동작은 source와 완전히 같습니다.
서브쉘 vs 현재 쉘의 차이
이 차이를 직접 확인해보겠습니다.
#!/bin/bash# 새 파일: scripts/env_test.shMY_VAR="스크립트에서 설정한 값"echo "스크립트 내부: MY_VAR=${MY_VAR}"
두 가지 방법으로 실행해봅니다.
$ bash scripts/env_test.sh스크립트 내부: MY_VAR=스크립트에서 설정한 값$ echo "스크립트 실행 후: MY_VAR=${MY_VAR}"스크립트 실행 후: MY_VAR=
bash로 실행하면 서브쉘에서 변수가 설정되고, 서브쉘이 종료되면 사라집니다. 부모 쉘인 현재 터미널에는 흔적이 없습니다.
$ source scripts/env_test.sh스크립트 내부: MY_VAR=스크립트에서 설정한 값$ echo "스크립트 실행 후: MY_VAR=${MY_VAR}"스크립트 실행 후: MY_VAR=스크립트에서 설정한 값
source로 실행하면 현재 쉘에서 직접 실행되므로 MY_VAR이 현재 세션에 남습니다.
| 실행 방법 | 실행 환경 | 실행 권한 필요 | 변수 영향 범위 |
|---|---|---|---|
./script.sh |
서브쉘 | 필요 | 서브쉘 내부만 |
bash script.sh |
서브쉘 | 불필요 | 서브쉘 내부만 |
source script.sh |
현재 쉘 | 불필요 | 현재 세션 전체 |
. script.sh |
현재 쉘 | 불필요 | 현재 세션 전체 |
PATH에 스크립트 디렉토리 추가하기
자주 쓰는 스크립트를 어디서든 실행하려면 스크립트가 있는 디렉토리를 PATH에 추가하면 됩니다.
# 스크립트 디렉토리 생성mkdir -p ~/bin# 스크립트를 ~/bin으로 복사하거나 이동cp scripts/greet.sh ~/bin/greetchmod +x ~/bin/greet# ~/.bashrc에 PATH 추가echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc# 현재 세션에 즉시 적용source ~/.bashrc
이제 어느 디렉토리에 있든 greet만 입력하면 실행됩니다.
$ greet안녕하세요, user님!현재 디렉토리: /home/user/documents현재 시각: 2026-04-24 10:30:00
~/bin은 많은 리눅스 배포판에서 기본적으로 PATH에 포함됩니다. Ubuntu 24.04에서도 ~/.profile에 해당 설정이 있어서, ~/bin 디렉토리가 존재하면 자동으로 PATH에 추가됩니다.