1. 사용 명령어 |
(1) uname
(2) echo
2. 키워드 & 사용처 |
(1) 키워드
범용성, 이식성, OS
(2) 사용처
OS마다 명령어 동작이 달라 각각 명령어를 변수로 정의하고 싶을 때 사용합니다.
3. 실행 예제 |
$ ./os-command.sh
이것은 줄이 이어진 메시지 입니다.
4. 스크립트 |
#!/bin/sh
# echo 명령어 경로를 환경에 따라서 바꿔서 셸 변수 ECHO에 대입
case $(uname -s) in ①
# Mac 이면 셸 내장이 아니라 bin/echo 사용
Darwin) ②
ECHO="/bin/echo" ②
;; ②
*)
ECHO="echo"
;;
esac
$ECHO -n "이것은 줄이 이어진 " ③
$ ECHO "메시지 입니다." ③
5. 해설 |
이 스크립트는 echo 명령어를 셸 변수 ECHO로 치환합니다. Mac echo 명령어는 줄을 바꾸지 않는 -n 옵션에 대응하지 않으므로 그럴 때 대응하는 방법입니다.
Mac 셸 내장 echo 명령어는 -n 옵션이 없으므로 리눅스에서 스크립트를 가여올 때는 echo -n 부분을 전수 수정해야 합니다. 따라서 그런 번거로움을 줄이고 범용성을 높이기 위한 것이 이 예제입니다.
셸 스크립트로 어떤 명령어를 변수명으로 치환한다면 그 명령어의 대문자 표기를 변수명으로 자주 사용합니다. 이것은 관습적인 것으로 기술적 이유가 있는 것은 아닙니다. 하지만 다른 사람이 작성한 스크립트를 읽을 때 이런 표현이 나올 때가 있으므로 기억해두면 좋습니다. 예제에서는 echo 명령어를 치환하므로 셸 변수 ECHO를 사용합니다.
우선 OS를 알아내기 위해 ①에서는 case문 인수로 uname 명령어를 실행합니다. uname 명령어는 시스템 정보를 표시하는 명령어로 OS 명칭을 표시하려면 -s 옵션을 사용합니다. 실제로 표시되는 문자열은 다음과 같습니다.
OS | uname -s 출력 |
Linux | Linux |
FreeBSD | FreeBSD |
MacOS | Darwin |
Solaris | SunOS |
②는 Mac(Darwin)이라면 셸 변수 ECHO에 /bin/echo를 지정해서 셸 내장 echo가 아니라 외부 명령어 /bin/echo를 사용하게 됩니다. 그 외 OS는 그대로 echo 명령어를 실행하고 싶으므로 셸 변수 ECHO에 echo를 입력합니다.
이렇게 해서 환경별 echo 명령어가 준비되면 ③에서 실행합니다. 이런 식으로 명령어를 변수로 치환하고 새롭게 정의한 변수를 명령어처럼 사용해서 스크립트를 작성합니다. 여기서 첫 번째 줄이-n으로 실행되므로 개행되지 않습니다. 실행 예처럼 당므 echo 명령어 출력도 이어서 표시됩니다. OS마다 명령어 행동이 조금 달라도 같은 스크립트로 여러 OS에 대응하는 스크립트를 작성할 수 있습니다.
<주의사항>
범용성을 중시하면 스크립트가 복잡해집니다. 이 예를 보면 echo 명령어 하나 때문에 이렇게까지 해야 하나 싶을 수도 있습니다. 사실 너무 범용성을 중시하다 보면 스크립트가 복잡해져서 본말전도됩니다. 하지만 이런 OS 범용성을 중시하는 스크립트는 오픈 소스 계열에 많으므로 알아두면 좋습니다.
gzip 명령어는 환경 변수 GZIP이 기본 옵션으로 상요되므로 예제에서 사용하는 방법을 쓸 때 주의해야 합니다.
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
댓글