📝shell 스크립트
shell
bash
linux
리눅스/유닉스 환경에서
.sh 스크립트를 source 로 실행할 때와 bash 로 실행할 때의 차이
🧑💻 개념 먼저 — 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) |
예:
- 만약 아래처럼 실행하면:
→ 환경 변수 FOO 가 설정되고, 현재 작업 디렉토리가 /tmp 로 바뀐 채로 유지됨.
- 반면 이렇게 실행하면:
→ 스크립트 안에서는 설정이 되었지만, 실행 종료 후에는 원래 쉘의 환경/디렉토리에는 아무 변화가 없음.
✅ 언제 source를 쓰고, 언제 bash를 써야 할까
🎯 source를 쓸 때
- 새 환경 변수나 PATH, PYTHONPATH, LD_LIBRARY_PATH 등을 “현재 쉘 세션에 적용” 하고 싶을 때
- 함수나 alias, 설정 등을 즉시 반영하고 싶을 때
.bashrc,.profile, 환경 설정 스크립트, 가상환경 활성화 스크립트 등 — “셸 환경 설정” 용 스크립트
예:
🛠️ bash (또는 ./) 로 실행할 때
- 프로그램 실행, 빌드, 설치, 자동화 작업처럼 “독립된 환경에서 행동”이 필요한 스크립트
- 스크립트 내에서 디렉토리 변경, 환경 변수 설정이 있어도 부모 쉘에 영향을 주면 안 될 때
- 간단한 명령의 집합을 “단발성으로 실행”하고자 할 때
🧪 실습 예제 — 직접 따라해보기
다음처럼 파일을 만들고, source / bash 로 실행한 뒤 결과를 비교해보자.
test_env.sh생성source 실행
→ 변수 설정, 디렉토리 변경 모두 현재 쉘에 반영됨
bash 실행
→ 스크립트 안에서는 동작했지만, 실행 종료 후 현재 쉘은 전혀 변하지 않음
이 실습을 통해 source 와 bash 의 차이를 체감할 수 있어.
💡 요약
source→ 현재 쉘을 그대로 사용, 환경 설정/변경을 유지bash/./→ 새 서브-쉘 생성, 부모 쉘에 영향 없음
“환경(변수/디렉토리)을 남기고 싶으면 source. 독립적으로 실행하고 싶으면 bash (./).”
🙋♂️ 주의사항 & 팁
.sh파일에 실행 권한이 없어도source로는 실행 가능 — 권한 필요 없음.- 반대로,
bash script.sh로 실행할 땐#!/bin/bashshebang이 있든 없든 동작 (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
sourceCommand in Bash — Vultr docs (docs.vultr.com)