쉘 스크립트 파일 실행 시 sub shell로 인한 환경변수 미등록 문제
190429
Problem 1. jdk 설치과정을 shell script file로 작성할 때 환경변수 세팅이 적용되지 않는 문제
- 원인: shell script file 실행 시 실행의 주체가되는 쉘 프로세스(현재 remote shell)가 새로운 sub shell 프로세스를 생성하여 sub shell 내에서 실행함
- sub shell은 부모쉘(sub shell 생성의 주체)과 독립된 메모리를 사용하기 때문에 이 때 등록한 환경변수를 스크립트를 모두 실행하고 부모쉘로 돌아갔을때 사용할 수 없음
- 해결방법: source 명령어를 사용하여 스크립트 파일 실행
- source script.sh 혹은 . ./script.sh 를 통해 스크립트 파일을 실행하면 새로운 sub shell을 생성하지 않고 기존의 쉘에서 스크립트를 바로 실행하므로 적용된 환경변수를 유지할 수 있음
- 주의사항: 현재 putty client로 실행한 remote shell(세션)을 그대로 사용하기 때문에 script 내에 exit 명령어가 동작하면 세션이 종료됨 -> 창 닫힘
Problem 2. source 명령어를 이용하니 갑자기 cp -f 로 덮어쓰는 명령어가 동작을 안하고 해당 명령어 실행 시 멈춤 -> waiting
- 원인: /dev/null로 버리던 stdout을 다시 띄워서 실행해보니 overwrite하겠냐는 interaction messsage가 출력됨
- 세부문제: cp 명령어에 f옵션(overwrite)을 주었는데도 interaction 메시지가 출력됨
- 세부원인: 배포판 설치 시 최근들어 alias로 cp, rm, mv에는 interaction(i) 옵션이 cp -i 와 같이 기본으로 등록되어 있다고함(확인해봤더니 실제 등록되어있음)
- 해결방법:
- \cp -f [src] [dst] : alias를 적용하지 않고 기본 명령어 실행
- /bin/cp -f [src] [dst] : 명령어 전체경로를 사용
- unalias cp : 등록되어있는 alias 제거
- .bashrc 파일에서 세션마다 등록되는 cp, mv, rm에 대한 alias 구문 제거
Problem 3. source /etc/profile 이 정상적으로 동작하지 않음 -> 명령어 실행 후 /etc/profile에 추가한 환경변수가 등록되지 않음
- 원인: 성공 및 에러 메시지 조작을 위해 모든 명령어는 err=$(명령어)와 같은 형식으로 사용하는데,, $()로 묶으면 sub shell을 새로 생성해서 실행함... source /etc/profile 명령어는 $()로 묶을 경우 동작하지 않음
- 해결방법:
- source /etc/profile && [profile내 환경변수가 필요한 구문]