Terminal에서의 Script 실행 명령어
`./`와 `.` 또는 `source`로 실행하는 스크립트들의 차이는 무엇일까?
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
export
는 NVM_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.sh
로 nvm.sh
파일을 실행하면,
실행이 끝나고 난 뒤에는 스크립트 안에서 선언된 nvm이라는 명령어는 원래 쉘에는 저장되지 않기 때문에,
실행이 완료되어도 nvm
명령어를 사용할 수 없다.
또한, ./test.sh
명령어는 스크립트 뿐만 아니라 Unix 실행파일을 실행하는데 사용되는 명령어이기도 해서,
스크립트를 실행하기 위해 스크립트에 실행권한이 필요하다.
.
또는 source
로 실행하기
반면에 . $NVM_DIR/test.sh
또는 source $NVM_DIR/test.sh
와 같이
.
명령어와 source
명령어를 통해 실행하는 스크립트는
현재 쉘 내에서 실행된다.
즉, 스크립트 내에서 새롭게 정의된 환경 변수들이 현재 쉘에도 그대로 저장된다는 의미이다.
또한, ./test.sh
와는 달리 스크립트 파일에 읽기 권한만 부여되어 있어도 실행이 가능합니다.