Terminal에서의 Script 실행 명령어

`./`와 `.` 또는 `source`로 실행하는 스크립트들의 차이는 무엇일까?
Posted on 2023-08-03 by GKSRUDTN99
MacOS Shell Terminal

React 설치 관련 포스팅을 작성하면서, nvm을 설치할 때, ~/.zshrc 파일에 아래와 같은 명령어 세줄이 자동으로 추가되었다.

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

exportNVM_DIR이라는 변수를 선언하기 위한 커맨드고,


[ -s "$NVM_DIR/nvm.sh" ]는 파일의 존재여부를 확인하는 명령어라고 한다. (파일이 존재하고 0바이트 이상의 크기를 가지면 True)


\. "$NVM_DIR/nvm.sh"NVM_DIR안에 있는 nvm.sh 파일을 실행하는 명령인 것 같은데,

보통 실행에 사용하던 $NVM_DIR/nvm.sh로 실행하는 방식과 어떤 차이가 있는걸까?



./로 실행하기

./test.sh와 같이 파일을 직접 명시해서 실행하면, 스크립트는 새로운 쉘에서 실행된다.


즉, 스크립트 안에서 새롭게 정의된 환경 변수들은 ./test.sh를 실행하는 주체인 원래 쉘에는 영향이 없다.


그래서 실제로, $NVM_DIR/nvm.shnvm.sh파일을 실행하면,

실행이 끝나고 난 뒤에는 스크립트 안에서 선언된 nvm이라는 명령어는 원래 쉘에는 저장되지 않기 때문에,

실행이 완료되어도 nvm 명령어를 사용할 수 없다.


또한, ./test.sh 명령어는 스크립트 뿐만 아니라 Unix 실행파일을 실행하는데 사용되는 명령어이기도 해서,

스크립트를 실행하기 위해 스크립트에 실행권한이 필요하다.



. 또는 source로 실행하기

반면에 . $NVM_DIR/test.sh 또는 source $NVM_DIR/test.sh와 같이

. 명령어와 source 명령어를 통해 실행하는 스크립트는

현재 쉘 내에서 실행된다.


즉, 스크립트 내에서 새롭게 정의된 환경 변수들이 현재 쉘에도 그대로 저장된다는 의미이다.


또한, ./test.sh와는 달리 스크립트 파일에 읽기 권한만 부여되어 있어도 실행이 가능합니다.