반응형
처음에 이 기사에서는 UNIX 서버 관리라고 하는 측면에서의 셸스크립트 프로그래밍을 채택합니다.또 셸 스크립트를 자작할 때의 포인트도 해설합니다.UNIX 서버를 관리할 때는, 도구로서의 셸 스크립트가 편리합니다.상시 로그를 감시한다고 해도, 입력하는 커맨드를 정리한다고 해도, UNIX 에 준비되어 있는 커맨드를 유효 활용하려면 셸 스크립트가 효과적입니다.셸스크립트는 명령어를 입력하는 작업의 연장선에서 프로그래밍을 할 수 있다는 쉬운 측면을 가지고 있지만 올바르게 이해하려면 많은 규칙이나 명령어를 외워야 한다는 번거로운 측면도 가지고 있습니다.셸스크립트를 습득하는 방법에는 여러 가지가 있습니다.차분히 시간을 낼 수 있다면 어떤 학습방법이라도 좋겠지만 입사 후에 UNIX 서버를 관리하게 되고 긴급하게 사용할 수 있어야 하는 어려운 상황이라면 다른 사람의 셸 스크립트를 읽고 용도에 따라 편집해 나가는 방법이 효과적입니다.셸스크립트는 현재 주류인 프로그래밍 언어와 달리 공백 개행의 취급이 명령어 프롬프트적인 등 이전까지의 프로그래밍 경험에서는 이해하기 어려운 면이 있습니다.따라서 언어 사양을 파악해서 처음부터 익혀나가는 것도 좋지만, 자신이 목적으로 하고 있는 셸스크립트를 찾아서 편집해서 사용하는 것이 더 효과적으로 기억될 수 있고 실용적이기도 합니다.앞으로 차근차근 셸스크립트를 배우려는 분들에게도 이 학습방법은 권해드릴 수 있습니다.대상 독자 본고에서는, 어느 정도 셸 스크립트를 사용할 수 있는, 중급자부터 상급자를 독자로서 상정합니다.필요한 환경 소개 셸 스크립트를 실행하기 위해 필요한 환경은 최근의 UNIX 호환 OS입니다.여기에서는 FreeBSD 5.3, NetBSD 2.0, OpenBSD 3.6, Novel SuSE 9.1, Solaris 8, Solaris 10 에서 동작을 확인하고 있습니다.셸 스크립트 셸 스크립트로 어떤 것을 실현할 수 있을까요.물론 하려고 하면 뭐든지 할 수 있지만, 셸 스크립트에는 그에 적합한 용도 범위가 있습니다.서버 기동정지 처리이거나 기존 명령어를 조합하는 경우에 효과를 발휘합니다.이후에는 셸스크립트로 구현할 수 있음을 보여주기 위한 목적으로 topless라고 하는 셸스크립트를 다루겠습니다.topless는 UNIX 서버 관리업무에서 사용할 수 있는 실용적인 스크립트입니다.셸 스크립트로서는 어려운 부류에 들어가 셸 스크립트의 한계를 파악해 두는 의미에서 효과적인 교재라고 할 수 있습니다.topless 쉘스크립트는, 2005년 봄에 행해진 관동 코신에츠 BUG 합동 합숙에서 개발되었습니다.합숙 도중 어떤 개발자분이 프롬프트 2.1 같은 명령어를 가르쳐 주셨어요.^[ 로 표시되고 있는 문자열은 ESC코드(1BH) 입니다.프롬프트 2.1 netstat 명령어 결과가 top처럼 출력되는 한 줄 명령어 (sh, bash 등 sh계열 셸에서 실행하는 경우)
# clear ; while : ; do echo - n ′ ^ [[ 1 ; 1H ′ ; netstat -nr; sleep 1; done이 명령어를 실행하면 netstat -nr이라고 하는 네트워크 연결 상황을 보여주는 명령어가 매초마다 단말기로 다시 그려집니다.프로세스의 상황을 화면에 보여주는 top이라고 하는 명령어가 있는데 그 출력내용이 netstat -nr 출력결과가 된 느낌입니다.이 처리의 요점은 clear에서 단말기를 클리어한 후에 echo ′[1;1H]′로서 화면 왼쪽 상단 모서리로 커서를 이동시키는 이스케이프 시퀀스를 단말기에 보내 명령어의 출력이 항상 같은 장소에 행해지도록 하고 있다는 점에 있습니다.그 자리에서 이 한 줄 명령어가 편리하다고 하기에 몇 가지 기능을 추가하여 상용할 수 있는 셸스크립트까지 만들게 되었습니다.그게 topless에요.topless 라는 이름은 top과 같은 출력을 하고 less와 같이 명령어의 Payzer로 취급한다는데서 명명된 이름입니다.FreeBSD에서 개발되었지만 나중에 사용자의 피드백을 바탕으로 NetBSD, OpenBSD, Linux, Solaris에서도 동작하도록 변경되었습니다.topless UNIX 환경이 있으신 분은 topless를 다운로드 받으시고 프롬프트 3.1과 같이 명령을 실행해 보시기 바랍니다.netstat -nr의 출력결과가 1초 간격으로 갱신되는 모습을 알 수 있습니다.프롬프트 3.1 topless 실행 예시
# topless netstat - nr 다음으로 - c를 지정하고 프롬프트 3.2와 같이 실행해 보십시오.출력 결과에 있어서, 이전의 출력과 다른 점이 빨간색으로 표시되게 됩니다.이전과 출력이 다른 행은 색을 입히는 기능이 topless에서 구현되고 있는 가장 주목받는 기능입니다.프롬프트 3.2 topless 실행 예 이전과의 차분에 색을 입힌다
# topless -c netstat -nr 추가로 -n 5 라는 지정을 하면 과거 5 회분까지 기록하고 변경된 행에 색이 남게 됩니다.네트워크를 감시하는 경우 등, 당분간 그 결과가 남아있는 편이 바람직한 경우가 많기 때문에 이 기능이 추가되었습니다.셸 스크립트로 실현하는 것은 이 기능 정도까지가 한계일 것입니다.이 이상은 너무 복잡해서, 셸 스크립트로 실현하기에는 그다지 이익이 없어집니다.프롬프트 3.4 topless 실행 예 과거 여러 번 비교 색칠
# topless - c - n 5 netstat - nr 그 밖에도, - h 로 도움말 표시, - v 로 버젼의 표시, - s 로 갱신 시간을 지정할 수 있으며, 커맨드를 종료하기 위한 키가 [Ctrl] + [c] 만이 아닌, top 와 같이 [q] 키로도 실시할 수 있도록 하고 있습니다.셸스크립트치고는 꽤 기교가 있는 편이죠.이 근처까지 오면, 일반적으로 C 언어나 다른 스크립트 언어로 다시 쓰거나 하는 것입니다.셸 스크립트로 실현하는 기능으로서는, 상당히 어려운 것으로 참고해 주세요.본체 처리 우선 처리 본체를 찾습니다.모르는 명령어가 사용되고 있었다고 해도, 적당히 짐작을 해서 건너뛴다.셸 스크립트를 읽을 경우, 지엽말절에는 구애받지 않고 어디가 처리의 본체인지를 찾습니다.그렇지 않으면 처리의 지엽말절이 신경이 쓰여 전체를 파악할 수 없게 되어 버리기 때문입니다.topless는 이전 출력과의 다른 부분에 색을 입히는 처리를 실현하기 위해 상당히 복잡한 것이지만 옵션이 지정되어 있지 않은 경우에 실행되지 않는 부분을 쫓다가 불필요한 부분을 지우고 정리해나가면 결국 다음과 같은 코드가 처리의 본체라는 것을 알 수 있습니다.리스트 4.1 셸 스크립트의 본체를 간파하다 : topless의 경우
while :
do
buffer = $ ( eval $ { @ + ′ $ @ ′ } )
echo - n ′ $ es _ cl $ es _ ho $ buffer ′
sleep $ waitsec
done 이것을 밝혀낼 수 있으면 결국 처리로서는 프롬프트2.1과 같은 것이 실행되고 있음을 알 수 있습니다.본체를 알 수 있으면, 그것을 코어로 해 스스로 스크립트를 확장해 나갈 수도 있습니다.이후에는 처리의 기본적인 아이디어와 흐름을 소개합니다.topless에서 사용되는 명령어의 의미 및 사용방법에 대해서는 매뉴얼을 참조하십시오.보기 제어topless에서는 scap science를 사용하여 문자열을 색칠하거나 단말기를 클리어하거나 커서의 위치를 이동시킵니다.단말기에 따라서는 이스케이프 시퀀스에서 꽤 많은 조작을 할 수 있습니다.단말기를 구사하고 싶은 경우는 한 번 이스케이프 시퀀스를 조사해 둡시다.대표적인 에스케이프 시퀀스를 표4.2에 나타냅니다.이스케이프 시퀀스 자신의 입력은 에디터마다 다릅니다.Emacs 이면[Ctrl]+[q]→[ESC]로, 단말에서 에디터를 사용하고 있는 경우는[Ctrl]+[v]→[ESC]로, 이스케이프 시퀀스 자신을 입력할 수 있습니다.이스케이프 시퀀스 자신을 입력하는 방법을 모르거나, 셸 스크립트내에 직접 이스케이프 시퀀스를 쓰는 것을 피하고 싶은 경우는, 리스트 4.3과 같이 echo 나 printf 명령어를 사용합니다.대표적인 에스케이프 시퀀스는 tput 명령어로도 출력시킬 수 있으므로 그것을 사용해도 좋을 것입니다.리스트 4.3 이스케이프 시퀀스를 명령어로 준비하는 예
color _ red = $ ( echo - e ′ e [ 31m ′ )
color _ blu = $ ( echo - e ′ e [ 34m ′ )
color _ org = $ ( echo - e ′ e [ 0m ′ )
es _ cl = $ ( tput clear ) # clear screen and home cursor
es_ho=$(tputhome) #homecursor 이전 출력과 다른 부분에 색을 입히는 처리는 diff 명령어를 사용하는 것으로 하고 있습니다.이전의 출력과 이번 출력을 파일에 보존하고, diff 명령어로 차이를 조사합니다.차이가 있는 행과 그렇지 않은 행은 변수에 상태를 기록해 두고, 그 변수를 바탕으로 색을 입힐 이스케이프 시퀀스를 부여하거나 하지 않거나를 선택하고 있습니다./bin/sh의 셸 스크립트는 배열을 사용할 수 없으므로 모두 변수로 설정합니다.여러 번 이전까지의 상태를 기록하는 방법은 이전 변수에 숫자를 설정하는 것으로 하고 있습니다.변수에 예를 들어 ′5′라는 값을 설정하고, 한 번 처리가 끝날 때마다 수치를 감산해 갑니다.변수가 0보다 크면 색칠을 하고 그렇지 않으면 색칠을 하지 않으셔야 합니다.이렇게 하면, 몇회분을 기록해 둘 수 있습니다.그리고 주목해야 할 것은, 공백 탭이 그대로 해석되도록 while 구문에서 사용되는 IFS 변수의 지정입니다.while read 처리에서는 공백 탭이 단축되기 때문에 그대로 문자열로 처리하기 위해서 IFS=를 지정해 둡니다.리스트 4.4 while IFS= read line이라는 사용법
echo ′ $ buffer ′ |
while IFS = read line
do
....나머지는 커맨드로 사용하기 위해서 인수처리를 추가하고, 인터럽트시 처리를 설정하시고, 미세조정을 더해 마무리했습니다.셸 스크립트를 편집하는 셸 스크립트의 내용이 파악되면 연습하는 의미도 함께 편집해 보겠습니다.예를 들어, 옵션의 디폴트 설정을 변경한다고 하는 간단한 것부터 시작합니다.topless이면 표시되는 색상이 빨간색에서는 보기 어렵기 때문에 파란색으로 변경하거나 표준 갱신시간을 더 길게 하고 싶은 것들로 시작합니다.거기에서 서서히 변경하는 장소를 늘려 가고, 변경했을 경우의 동작의 차이를 순서대로 조사하면서 작업을 실시합니다.직접 실행하면서 편집하면 의외로 빨리 셸스크립트를 이해할 수 있습니다.편집하고 변경하는 것에 익숙해지면 리스트 4.1과 같이 본체에서만 직접 명령어를 조립하여 작성해 봅니다.처음에는 원래의 셸 스크립트를 참고하면서 이해할 수 있는 범위 내에서 작업을 진행합니다.모르는 부분이 나오면 순서대로 매뉴얼을 조사하면서 작업을 진행하도록 합니다.셸 스크립트에 익숙해지면, 처음부터 스스로 작성해 봅니다.몇 개의 셸 스크립트로 이를 수행하면 셸 스크립트가 상당히 실용적으로 사용할 수 있게 될 것입니다.호환성에 대해 UNIX 서버의 관리를 실시할 때는, 한 종류의 OS로 끝난다고는 할 수 없습니다.대상으로 삼는 OS가 여러 개 있는 경우에는 작성한 셸 스크립트도 여러 OS로 움직여 주었으면 합니다.우선, 쉘스크립트는 기본적으로 /bin/sh를 선택하도록 합니다./bin/sh는 대부분의 UNIX에 준비되어 있습니다.일단 작성하면 각종 OS에서 동작을 알아보고 사용하는 셸 스크립트의 기능이나 명령어를 어느 OS에나 있는 것으로 교체합니다.예를 들어 리스트 6.1의 처리는 OS간의 호환성을 얻기 위한 처리입니다.OS별 상황에 따라 실행할 명령어가 틀리거나 자체적으로 같은 이름의 명령어를 준비하고 있습니다.리스트 6.1 호환성을 위한 처리
tput _ cll = $ ( tput ce 2 > / dev / null )
tput _ cls = $ ( tput cd 2 > / dev / null )
es _ ce = $ { tput _ cll : - $ ( tput el ) }
es _ cd = $ { tput _ cls : - $ ( tput ed ) }
stty size > / dev / null 2 > & 1 &&
readonly sttysize = ′ stty size ′ ||
readonly sttysize = ′ / usr / ucb / stty size ′
type mktemp > / dev / null 2 > & 1 ||
mktemp ( )
{
> ${@+′$@′.$$}
chmod 600 $ { @ + ′ $ @ ′ . $$ }
echo $ { @ + ′ $ @ ′ . $$ }
}/bin/sh의 기능은 어느 UNIX나 비슷하나 Solaris 등 특정 OS는 정책 차이로 인해 다른 OS에서 갖고 있는 기능이 들어 있지 않을 수 있습니다.그러한 경우 Solaris판 sh에 실장을 맞추거나 Solaris에서는 /bin/sh 대신에 bash를 사용하거나 합니다.Solaris 에서는 bash 를 사용하도록 하는 풀린 처리를 실현하기 위해서는 예를 들어 리스트 6.2 와 같이 기술합니다.리스트 6.2 Solaris에서는 bash를 사용하도록 하는 처리
# ! / bin / sh
[ - z $ { BOOTED - ′′ } - a SunOS = ` uname - s ` ] && exec env BOOTED = yes
bash ′$0′ ′$@′ 어디까지 호환성을 고려할지는 케이스 바이 케이스에서 선택합니다.의미 없이 호환성을 고려해도 사용하기 어려워질 뿐입니다.자신이 사용하는 범위 안에서 적당히만 하면 충분해요.정리 실용 쉘스크립트로 topless를 채택하였습니다.셸스크립트는 UNIX를 활용하기 위한 효과적인 도구입니다.적절한 용도 범위라면 단시간에 효과적인 명령을 작성할 수 있습니다.셸스크립트는 편리한 반면, 잡다하기도 합니다.하나하나자세히살펴보면지엽말절에얽매여서작성을못하게되거나이해가안가게됩니다.우선 확실하게 동작하는 것을 편집하거나 확실히 동작하는 것부터 펼쳐 나갑니다.셸 스크립트는 편리한 기능입니다.기존의 것을 이용하는 등 적극적으로 활용해 나갑시다.
# clear ; while : ; do echo - n ′ ^ [[ 1 ; 1H ′ ; netstat -nr; sleep 1; done이 명령어를 실행하면 netstat -nr이라고 하는 네트워크 연결 상황을 보여주는 명령어가 매초마다 단말기로 다시 그려집니다.프로세스의 상황을 화면에 보여주는 top이라고 하는 명령어가 있는데 그 출력내용이 netstat -nr 출력결과가 된 느낌입니다.이 처리의 요점은 clear에서 단말기를 클리어한 후에 echo ′[1;1H]′로서 화면 왼쪽 상단 모서리로 커서를 이동시키는 이스케이프 시퀀스를 단말기에 보내 명령어의 출력이 항상 같은 장소에 행해지도록 하고 있다는 점에 있습니다.그 자리에서 이 한 줄 명령어가 편리하다고 하기에 몇 가지 기능을 추가하여 상용할 수 있는 셸스크립트까지 만들게 되었습니다.그게 topless에요.topless 라는 이름은 top과 같은 출력을 하고 less와 같이 명령어의 Payzer로 취급한다는데서 명명된 이름입니다.FreeBSD에서 개발되었지만 나중에 사용자의 피드백을 바탕으로 NetBSD, OpenBSD, Linux, Solaris에서도 동작하도록 변경되었습니다.topless UNIX 환경이 있으신 분은 topless를 다운로드 받으시고 프롬프트 3.1과 같이 명령을 실행해 보시기 바랍니다.netstat -nr의 출력결과가 1초 간격으로 갱신되는 모습을 알 수 있습니다.프롬프트 3.1 topless 실행 예시
# topless netstat - nr 다음으로 - c를 지정하고 프롬프트 3.2와 같이 실행해 보십시오.출력 결과에 있어서, 이전의 출력과 다른 점이 빨간색으로 표시되게 됩니다.이전과 출력이 다른 행은 색을 입히는 기능이 topless에서 구현되고 있는 가장 주목받는 기능입니다.프롬프트 3.2 topless 실행 예 이전과의 차분에 색을 입힌다
# topless -c netstat -nr 추가로 -n 5 라는 지정을 하면 과거 5 회분까지 기록하고 변경된 행에 색이 남게 됩니다.네트워크를 감시하는 경우 등, 당분간 그 결과가 남아있는 편이 바람직한 경우가 많기 때문에 이 기능이 추가되었습니다.셸 스크립트로 실현하는 것은 이 기능 정도까지가 한계일 것입니다.이 이상은 너무 복잡해서, 셸 스크립트로 실현하기에는 그다지 이익이 없어집니다.프롬프트 3.4 topless 실행 예 과거 여러 번 비교 색칠
# topless - c - n 5 netstat - nr 그 밖에도, - h 로 도움말 표시, - v 로 버젼의 표시, - s 로 갱신 시간을 지정할 수 있으며, 커맨드를 종료하기 위한 키가 [Ctrl] + [c] 만이 아닌, top 와 같이 [q] 키로도 실시할 수 있도록 하고 있습니다.셸스크립트치고는 꽤 기교가 있는 편이죠.이 근처까지 오면, 일반적으로 C 언어나 다른 스크립트 언어로 다시 쓰거나 하는 것입니다.셸 스크립트로 실현하는 기능으로서는, 상당히 어려운 것으로 참고해 주세요.본체 처리 우선 처리 본체를 찾습니다.모르는 명령어가 사용되고 있었다고 해도, 적당히 짐작을 해서 건너뛴다.셸 스크립트를 읽을 경우, 지엽말절에는 구애받지 않고 어디가 처리의 본체인지를 찾습니다.그렇지 않으면 처리의 지엽말절이 신경이 쓰여 전체를 파악할 수 없게 되어 버리기 때문입니다.topless는 이전 출력과의 다른 부분에 색을 입히는 처리를 실현하기 위해 상당히 복잡한 것이지만 옵션이 지정되어 있지 않은 경우에 실행되지 않는 부분을 쫓다가 불필요한 부분을 지우고 정리해나가면 결국 다음과 같은 코드가 처리의 본체라는 것을 알 수 있습니다.리스트 4.1 셸 스크립트의 본체를 간파하다 : topless의 경우
while :
do
buffer = $ ( eval $ { @ + ′ $ @ ′ } )
echo - n ′ $ es _ cl $ es _ ho $ buffer ′
sleep $ waitsec
done 이것을 밝혀낼 수 있으면 결국 처리로서는 프롬프트2.1과 같은 것이 실행되고 있음을 알 수 있습니다.본체를 알 수 있으면, 그것을 코어로 해 스스로 스크립트를 확장해 나갈 수도 있습니다.이후에는 처리의 기본적인 아이디어와 흐름을 소개합니다.topless에서 사용되는 명령어의 의미 및 사용방법에 대해서는 매뉴얼을 참조하십시오.보기 제어topless에서는 scap science를 사용하여 문자열을 색칠하거나 단말기를 클리어하거나 커서의 위치를 이동시킵니다.단말기에 따라서는 이스케이프 시퀀스에서 꽤 많은 조작을 할 수 있습니다.단말기를 구사하고 싶은 경우는 한 번 이스케이프 시퀀스를 조사해 둡시다.대표적인 에스케이프 시퀀스를 표4.2에 나타냅니다.이스케이프 시퀀스 자신의 입력은 에디터마다 다릅니다.Emacs 이면[Ctrl]+[q]→[ESC]로, 단말에서 에디터를 사용하고 있는 경우는[Ctrl]+[v]→[ESC]로, 이스케이프 시퀀스 자신을 입력할 수 있습니다.이스케이프 시퀀스 자신을 입력하는 방법을 모르거나, 셸 스크립트내에 직접 이스케이프 시퀀스를 쓰는 것을 피하고 싶은 경우는, 리스트 4.3과 같이 echo 나 printf 명령어를 사용합니다.대표적인 에스케이프 시퀀스는 tput 명령어로도 출력시킬 수 있으므로 그것을 사용해도 좋을 것입니다.리스트 4.3 이스케이프 시퀀스를 명령어로 준비하는 예
color _ red = $ ( echo - e ′ e [ 31m ′ )
color _ blu = $ ( echo - e ′ e [ 34m ′ )
color _ org = $ ( echo - e ′ e [ 0m ′ )
es _ cl = $ ( tput clear ) # clear screen and home cursor
es_ho=$(tputhome) #homecursor 이전 출력과 다른 부분에 색을 입히는 처리는 diff 명령어를 사용하는 것으로 하고 있습니다.이전의 출력과 이번 출력을 파일에 보존하고, diff 명령어로 차이를 조사합니다.차이가 있는 행과 그렇지 않은 행은 변수에 상태를 기록해 두고, 그 변수를 바탕으로 색을 입힐 이스케이프 시퀀스를 부여하거나 하지 않거나를 선택하고 있습니다./bin/sh의 셸 스크립트는 배열을 사용할 수 없으므로 모두 변수로 설정합니다.여러 번 이전까지의 상태를 기록하는 방법은 이전 변수에 숫자를 설정하는 것으로 하고 있습니다.변수에 예를 들어 ′5′라는 값을 설정하고, 한 번 처리가 끝날 때마다 수치를 감산해 갑니다.변수가 0보다 크면 색칠을 하고 그렇지 않으면 색칠을 하지 않으셔야 합니다.이렇게 하면, 몇회분을 기록해 둘 수 있습니다.그리고 주목해야 할 것은, 공백 탭이 그대로 해석되도록 while 구문에서 사용되는 IFS 변수의 지정입니다.while read 처리에서는 공백 탭이 단축되기 때문에 그대로 문자열로 처리하기 위해서 IFS=를 지정해 둡니다.리스트 4.4 while IFS= read line이라는 사용법
echo ′ $ buffer ′ |
while IFS = read line
do
....나머지는 커맨드로 사용하기 위해서 인수처리를 추가하고, 인터럽트시 처리를 설정하시고, 미세조정을 더해 마무리했습니다.셸 스크립트를 편집하는 셸 스크립트의 내용이 파악되면 연습하는 의미도 함께 편집해 보겠습니다.예를 들어, 옵션의 디폴트 설정을 변경한다고 하는 간단한 것부터 시작합니다.topless이면 표시되는 색상이 빨간색에서는 보기 어렵기 때문에 파란색으로 변경하거나 표준 갱신시간을 더 길게 하고 싶은 것들로 시작합니다.거기에서 서서히 변경하는 장소를 늘려 가고, 변경했을 경우의 동작의 차이를 순서대로 조사하면서 작업을 실시합니다.직접 실행하면서 편집하면 의외로 빨리 셸스크립트를 이해할 수 있습니다.편집하고 변경하는 것에 익숙해지면 리스트 4.1과 같이 본체에서만 직접 명령어를 조립하여 작성해 봅니다.처음에는 원래의 셸 스크립트를 참고하면서 이해할 수 있는 범위 내에서 작업을 진행합니다.모르는 부분이 나오면 순서대로 매뉴얼을 조사하면서 작업을 진행하도록 합니다.셸 스크립트에 익숙해지면, 처음부터 스스로 작성해 봅니다.몇 개의 셸 스크립트로 이를 수행하면 셸 스크립트가 상당히 실용적으로 사용할 수 있게 될 것입니다.호환성에 대해 UNIX 서버의 관리를 실시할 때는, 한 종류의 OS로 끝난다고는 할 수 없습니다.대상으로 삼는 OS가 여러 개 있는 경우에는 작성한 셸 스크립트도 여러 OS로 움직여 주었으면 합니다.우선, 쉘스크립트는 기본적으로 /bin/sh를 선택하도록 합니다./bin/sh는 대부분의 UNIX에 준비되어 있습니다.일단 작성하면 각종 OS에서 동작을 알아보고 사용하는 셸 스크립트의 기능이나 명령어를 어느 OS에나 있는 것으로 교체합니다.예를 들어 리스트 6.1의 처리는 OS간의 호환성을 얻기 위한 처리입니다.OS별 상황에 따라 실행할 명령어가 틀리거나 자체적으로 같은 이름의 명령어를 준비하고 있습니다.리스트 6.1 호환성을 위한 처리
tput _ cll = $ ( tput ce 2 > / dev / null )
tput _ cls = $ ( tput cd 2 > / dev / null )
es _ ce = $ { tput _ cll : - $ ( tput el ) }
es _ cd = $ { tput _ cls : - $ ( tput ed ) }
stty size > / dev / null 2 > & 1 &&
readonly sttysize = ′ stty size ′ ||
readonly sttysize = ′ / usr / ucb / stty size ′
type mktemp > / dev / null 2 > & 1 ||
mktemp ( )
{
> ${@+′$@′.$$}
chmod 600 $ { @ + ′ $ @ ′ . $$ }
echo $ { @ + ′ $ @ ′ . $$ }
}/bin/sh의 기능은 어느 UNIX나 비슷하나 Solaris 등 특정 OS는 정책 차이로 인해 다른 OS에서 갖고 있는 기능이 들어 있지 않을 수 있습니다.그러한 경우 Solaris판 sh에 실장을 맞추거나 Solaris에서는 /bin/sh 대신에 bash를 사용하거나 합니다.Solaris 에서는 bash 를 사용하도록 하는 풀린 처리를 실현하기 위해서는 예를 들어 리스트 6.2 와 같이 기술합니다.리스트 6.2 Solaris에서는 bash를 사용하도록 하는 처리
# ! / bin / sh
[ - z $ { BOOTED - ′′ } - a SunOS = ` uname - s ` ] && exec env BOOTED = yes
bash ′$0′ ′$@′ 어디까지 호환성을 고려할지는 케이스 바이 케이스에서 선택합니다.의미 없이 호환성을 고려해도 사용하기 어려워질 뿐입니다.자신이 사용하는 범위 안에서 적당히만 하면 충분해요.정리 실용 쉘스크립트로 topless를 채택하였습니다.셸스크립트는 UNIX를 활용하기 위한 효과적인 도구입니다.적절한 용도 범위라면 단시간에 효과적인 명령을 작성할 수 있습니다.셸스크립트는 편리한 반면, 잡다하기도 합니다.하나하나자세히살펴보면지엽말절에얽매여서작성을못하게되거나이해가안가게됩니다.우선 확실하게 동작하는 것을 편집하거나 확실히 동작하는 것부터 펼쳐 나갑니다.셸 스크립트는 편리한 기능입니다.기존의 것을 이용하는 등 적극적으로 활용해 나갑시다.
반응형