이번 시간에는 리눅스에서 sh 명령어와 source 명령어의 차이를 알아보겠습니다.


 먼저 1.sh에 다음과 같이 입력해 보겠습니다.

 

 echo $$가 보이는데요. 이것은 쉘의 current process id를 의미합니다. 이는, subshell로 실행되는지, 현재 쉘에서 실행되는지 판단하기 위해서입니다.

 

 chmod로 1.sh의 실행 권한을 바꿉니다. 그리고 ls -ail을 입력해 보시면, cho, cho 그룹에 속한 유저, 모든 유저에게 x 권한이 주어졌음을 알 수 있는데요. 이는 실행 권한이 주어졌다는 것을 의미합니다. 그러면, 1.sh를 실행할 수 있습니다. 이제 sub shell을 띄워서 실행시키는지, 그렇지 않은지는 어떻게 검증하면 될까요?

 

 

 현재 쉘의 pid를 알기 위해서는 echo $$을 입력하면 됩니다. 그리고 1.sh는 현재 1.sh를 실행시키는 것의 pid를 출력하게 됩니다. 만약에 이 둘이 같다면, 동일 쉘에서 실행시키는 것일 겁니다. 다르다면? 다른 쉘에서 실행시키는 것입니다. 즉, 현재 쉘에서 echo $$ 명령어를 입력해서, 현재 명령어를 입력하는 쉘의 pid를 알아오면 됩니다.

 

 2554가 나왔는데요. sh 1.sh를 입력해 보니, 2789가 나왔습니다. 어떻게 된 일일까요?

 

 sub shell이 실행된 것입니다. 프로세스 id가 다른 것이니, sh 1.sh를 입력한 쉘과 별개의 쉘이 실행되었다고 볼 수 있습니다. '별개의 프로세스'로 보아야 합니다.

 

 반면에, source 명령어를 보면, 2554, 2554로 같음을 알 수 있어요. 즉, echo $$가 실행된 쉘과 동일한 쉘에서 1.sh가 실행되었음을 알 수 있어요. sub shell을 만들지 않았다는 이야기가 됩니다.

 


 이제, 테스트용 shell을 작성해 보겠습니다.

 이것은 현재 프로세스 id를 출력하고, 홈 디렉토리로 이동한 다음에 현재 경로를 출력합니다.

 

 먼저 sh 명령어는 어떻게 될까요? sub shell에서는 /home/cho로 이동하였는데요. bash에서는 그렇지 않았네요. ~/jo_test가 찍히고 있어요. 왜 그럴까요?

 

 

 cd ~를 실행한 쉘은 별개였기 때문입니다. cd ~ 를 해 봤자, sh 명령어를 입력한 쉘과는 별개였기 때문입니다.

 

 반면에, source는 달랐다는 것을 알 수 있어요. 1.sh가 실행된 쉘의 id가 2554였고, cd ~를 수행하고 난 후에 /home/cho, 즉 ~로 이동을 했어요. 끝나고 나서 보니까, 내가 source 명령어를 친 쉘에 pwd를 쳐 보니까, /home/cho로 이동했음을 볼 수 있는데요.

 

 

 이는 내가 현재 로그인 하고 있는 (그러니까 source 명령을 입력한 쉘)과 1.sh에 있는 명령어들을 실행한 쉘이 같기 때문입니다. pid 값이 같은 것도 위에서 확인했으니 두 말할 것도 없겠네요.

 

 다시 한 번 정리해 봅시다. sh는 별개의 프로세스가 생성됩니다. 즉, 서브 쉘이 생성됩니다. 그래서 sh 1.sh를 입력하면 1.sh에 있는 것들이 별개의 쉘에서 실행이 됩니다. 따라서, 설정 값의 변경이 sub에만 적용되게 됩니다. 당연하게도, sub에서 cd ~를 해 봤자 본 쉘에서 적용되지는 않을 겁니다. 반면에, 소스는 서브 쉘을 생성하지 않고 현재 쉘에서 스크립트를 실행시킨다는 것만 기억하시면 되겠네요.