Curieux.JY
  • Projects
  • Post
  • Note
  • JungYeon Lee

On this page

  • 🧑‍💻 개념 먼저 — source 와 bash 실행의 본질적인 차이
  • 🔄 구체적인 차이 — 환경, 변수, 디렉토리, 함수 등에서
  • ✅ 언제 source를 쓰고, 언제 bash를 써야 할까
    • 🎯 source를 쓸 때
    • 🛠️ bash (또는 ./) 로 실행할 때
  • 🧪 실습 예제 — 직접 따라해보기
  • 💡 요약
  • 🙋‍♂️ 주의사항 & 팁

📝shell 스크립트

shell
bash
linux
리눅스/유닉스 환경에서 .sh 스크립트를 source 로 실행할 때와 bash 로 실행할 때의 차이
Published

December 1, 2025

🧑‍💻 개념 먼저 — source 와 bash 실행의 본질적인 차이

  • source script.sh (또는 . script.sh):
    현재 동일한 쉘 세션에서 스크립트를 읽고 실행.
    즉, 마치 그 파일 안의 커맨드를 그대로 터미널에 타이핑한 것처럼 동작.

  • bash script.sh (또는 ./script.sh) :
    새로운 서브-쉘(sub-shell, 자식 프로세스) 을 생성해서 스크립트를 실행.
    스크립트가 끝나면 그 서브-쉘은 종료되고, 그 안에서 생긴 변수나 환경 변화는 사라진다.


🔄 구체적인 차이 — 환경, 변수, 디렉토리, 함수 등에서

항목 source script.sh bash script.sh (또는 ./script.sh)
실행 쉘 현재 쉘 (same process) 새 서브-쉘 (자식 프로세스)
환경 변수 / 함수 / alias 현재 쉘에 영구 반영 서브-쉘 안에서만 유효, 종료 시 사라짐
현재 디렉토리 변경 (cd) 쉘의 현재 디렉토리가 바뀜 부모 셸의 디렉토리는 변하지 않음
스크립트 실행 후 효과 유지됨 유지되지 않음 (격리됨)
스크립트 파일의 실행 권한 필요 없음 실행 권한 필요 (또는 bash file.sh)

예:

# myscript.sh
#!/bin/bash
# demonstrate setting a variable and changing directory
echo "Before: PWD=$PWD, FOO=$FOO"
export FOO="hello_from_script"
cd /tmp
echo "Inside script: PWD=$PWD, FOO=$FOO"
  • 만약 아래처럼 실행하면:
$ source myscript.sh
Before: PWD=/home/user, FOO=
Inside script: PWD=/tmp, FOO=hello_from_script
$ echo "After: PWD=$PWD, FOO=$FOO"
After: PWD=/tmp, FOO=hello_from_script

→ 환경 변수 FOO 가 설정되고, 현재 작업 디렉토리가 /tmp 로 바뀐 채로 유지됨.

  • 반면 이렇게 실행하면:
$ bash myscript.sh        # 또는 ./myscript.sh
Before: PWD=/home/user, FOO=
Inside script: PWD=/tmp, FOO=hello_from_script
$ echo "After: PWD=$PWD, FOO=$FOO"
After: PWD=/home/user, FOO=

→ 스크립트 안에서는 설정이 되었지만, 실행 종료 후에는 원래 쉘의 환경/디렉토리에는 아무 변화가 없음.


✅ 언제 source를 쓰고, 언제 bash를 써야 할까

🎯 source를 쓸 때

  • 새 환경 변수나 PATH, PYTHONPATH, LD_LIBRARY_PATH 등을 “현재 쉘 세션에 적용” 하고 싶을 때
  • 함수나 alias, 설정 등을 즉시 반영하고 싶을 때
  • .bashrc, .profile, 환경 설정 스크립트, 가상환경 활성화 스크립트 등 — “셸 환경 설정” 용 스크립트

예:

source ~/.bashrc  
source ~/ros2_ws/install/setup.bash   # ROS2 사용 시

🛠️ bash (또는 ./) 로 실행할 때

  • 프로그램 실행, 빌드, 설치, 자동화 작업처럼 “독립된 환경에서 행동”이 필요한 스크립트
  • 스크립트 내에서 디렉토리 변경, 환경 변수 설정이 있어도 부모 쉘에 영향을 주면 안 될 때
  • 간단한 명령의 집합을 “단발성으로 실행”하고자 할 때

🧪 실습 예제 — 직접 따라해보기

다음처럼 파일을 만들고, source / bash 로 실행한 뒤 결과를 비교해보자.

  1. test_env.sh 생성

    #!/bin/bash
    echo "Inside script: initial PWD = $PWD"
    export TEST_VAR="my_test_value"
    cd /tmp
    echo "Inside script: moved to PWD = $PWD"
    echo "Inside script: TEST_VAR = $TEST_VAR"
  2. source 실행

    $ pwd
    /home/youruser
    $ source test_env.sh
    Inside script: initial PWD = /home/youruser
    Inside script: moved to PWD = /tmp
    Inside script: TEST_VAR = my_test_value
    $ pwd
    /tmp
    $ echo $TEST_VAR
    my_test_value

    → 변수 설정, 디렉토리 변경 모두 현재 쉘에 반영됨

  3. bash 실행

    $ pwd
    /home/youruser
    $ bash test_env.sh
    Inside script: initial PWD = /home/youruser
    Inside script: moved to PWD = /tmp
    Inside script: TEST_VAR = my_test_value
    $ pwd
    /home/youruser
    $ echo $TEST_VAR

    → 스크립트 안에서는 동작했지만, 실행 종료 후 현재 쉘은 전혀 변하지 않음

이 실습을 통해 source 와 bash 의 차이를 체감할 수 있어.


💡 요약

  • source → 현재 쉘을 그대로 사용, 환경 설정/변경을 유지
  • bash / ./ → 새 서브-쉘 생성, 부모 쉘에 영향 없음

“환경(변수/디렉토리)을 남기고 싶으면 source. 독립적으로 실행하고 싶으면 bash (./).”


🙋‍♂️ 주의사항 & 팁

  • .sh 파일에 실행 권한이 없어도 source 로는 실행 가능 — 권한 필요 없음.
  • 반대로, bash script.sh 로 실행할 땐 #!/bin/bash shebang이 있든 없든 동작 (bash가 직접 실행하기 때문).
  • 만약 스크립트가 환경 세팅 + 프로그램 실행을 같이 한다면, 환경 세팅은 source, 실행은 bash 로 분리하는 것이 안전.

📚 출처 / 참고 자료

  • What is the difference between executing a Bash script vs sourcing it — SuperUser Q&A (Super User)
  • Difference Between Sourcing and Executing a Script — Baeldung article (Baeldung on Kotlin)
  • “source / .” 와 “bash” 의 차이 설명 — Bangseongbeom 블로그 (bangseongbeom.com)
  • How to Use the source Command in Bash — Vultr docs (docs.vultr.com)

Copyright 2026, JungYeon Lee