source와 sh의 차이

Q&A·2023년 11월 6일

상황

  • 나는 동시에 여러 고객사의 프로그램을 관리하고 있다. 고객사에 배포하기 전에는 내 컴퓨터의 VM에 올려서 테스트를 하고 반입 신청을 하는데 환경변수/모듈/소스를 고객사에 맞게 갈아끼워서 테스트하는 게 너무 귀찮았다.
  • 그래서 VM에 고객사1 인스턴스, 고객사2 인스턴스를 올린 Multi-instance 환경을 구축했다.
  • 두 고객사에 허용된 라이선스가 다르고 참조하는 모듈들도 다르기 때문에 해당 고객사의 코드를 실행하기 전에 환경변수에서 라이선스 경로와 모듈의 경로를 설정해야 했고 나는 그걸 라이선스1/bin/setenv.sh 에 설정했다. 그런데 희한한 현상이 생겼다.
  1. sh startup.sh 명령어로는 환경변수 적용 안 됨
  2. source startup.sh 명령어로는 환경변수 적용됨

 

결론

이 현상은 shsource의 차이였다.

  • sh: 쉘 스크립트 실행 시 서브쉘에 명령을 입력하고, 현재 쉘로 출력만 복사한 뒤 서브쉘은 닫는다. 서브쉘에 적용한 환경에 대한 모든 사항은 이 순간 사라진다.
  • source: 쉘 스크립트를 실행시킬 때 현재 쉘에 명령을 입력한다. 당연히 환경에 대한 모든 사항 현재 쉘에 적용된다.
  • 눈으로 확인하기 위해 setenv.sh 시작, 끝부분에 echo $$ 입력해 지금 실행되는 쉘 프로세스의 pid를 출력하도록 한 뒤, 각각 shsource로 실행해보았다. 전자의 경우 현재 쉘과 pid가 달랐다!

그러니까 sh로 환경변수를 설정한다는 것은 아래 그림과 같았던 것이다... 충격적.... 근데 재미있다.

profile
스스로에게 질문을 던지고, 대답하는 블로그

0개의 댓글