IT/리눅스마스터1급

sh 와 source 차이

알콩달콩아빠 2023. 3. 26. 19:11
728x90
반응형

sh와 source( 명령어 차이

  • sh : 새 셸을 여는 스크립트를 실행할 때 새 셸에 명령을 입력하고 출력을 다시 현재 셸로 복사한 다음 새 셸을 닫습니다. 환경에 대한 모든 변경 사항은 새 셸에서만 적용되며 새 셸이 닫히면 손실됩니다.
  • source : 스크립트를 소싱할 때 현재 쉘에 명령을 입력하는 것입니다. 환경에 대한 모든 변경 사항은 적용되고 현재 셸에 유지됩니다.

위에서의 "환경"은 현재 작업 디렉토리, 환경 변수, 쉘 설정(history and completion features) 과 같은 것입니다.

현재 실행 중인 쉘에서 환경을 변경하도록 하려면 source를 사용하고 그렇지 않으면 shell을 사용합니다.

 

파일이 실행 가능하고 현재 디렉토리에 있는 경우 myscript를 실행합니다. 선행 점과 슬래시(./)는 현재 디렉토리를 나타냅니다. 이것은 현재 디렉토리가 $PATH에 등록되어 있을 경우에는 점과 슬래시(./)가 필요없습니다.

./myscript

 

파일이 실행 가능하고 $PATH의 일부 디렉토리에 있는 경우 myscript를 실행합니다.

myscript

 

아래 명령어는 myscript를 소싱합니다. 파일은 실행 가능하지 않아도 되지만 유효한 쉘 스크립트여야 합니다. 파일은 현재 디렉토리 또는 $PATH의 디렉토리에 있을 수 있습니다.

source myscript

 

아래 명령어도 myscript를 소싱합니다. 이 명령어는 POSIX에서 정의한 것입니다. Bash는 점(.)에 대한 별칭으로 source를 정의했습니다.

. myscript

 

예제)

야래 내용의 pid.sh 파일이 있습니다.($$는 현재 실행 중인 셸 프로세스의 PID를 나타냅니다.)

#!/bin/sh
echo $$

 

현재 쉘의 PID를 출력합니다.

$ echo $$
1676

스크립트를 source

$ source pid.sh
1676

 

스크립트를 실행하고 PID를 확인합니다. 아래와 같이 pid 가 변경 된 것을 확인할 수 있습니다.

$ ./pid.sh
1944

 

쉘을 다시한 번 수행합니다. 아래와 같이 pid 가 변경되는 것을 확인할 수 있습니다.

$ ./pid.sh
1945

스크립트를 실행하면 매번 새로운 프로세스가 생성되는 동안 스크립트를 소싱하면 동일한 프로세스에서 실행되는 것을 볼 수 있습니다. 그 새로운 프로세스는 스크립트 실행을 위해 생성된 새로운 쉘입니다. 스크립트를 소싱하면 새 쉘이 생성되지 않으므로 PID가 동일하게 유지됩니다.

 

sh는 별개의 프로세스가 생성됩니다. 즉, 서브 쉘이 생성됩니다. 설정 값의 변경이 sub 쉘에만 적용되게 됩니다.  

source는 서브 쉘을 생성하지 않고 현재 쉘에서 스크립트를 실행시킵니다.

 

출처 : sh 와 source 차이 :: 잡학문구 (tistory.com)

728x90
반응형