iBetter Books
수정

실행 권한과 실행 방법

스크립트를 작성했다고 해서 바로 실행할 수 있는 것은 아닙니다. 리눅스는 파일마다 누가 읽고, 쓰고, 실행할 수 있는지 권한을 별도로 관리합니다. 그리고 스크립트를 실행하는 방법도 한 가지가 아닙니다. 어떤 방법을 고르느냐에 따라 동작 방식이 달라집니다.

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

rwxx가 추가되었습니다. 본인에게만 실행 권한을 주고 싶다면 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에 추가됩니다.