정보공간_1

[2기 부산 배보람] 쉘 프로그래밍을 이용한 간단한 GUI 프로그램 만들기 본문

IT 놀이터/Elite Member Tech & Talk

[2기 부산 배보람] 쉘 프로그래밍을 이용한 간단한 GUI 프로그램 만들기

알 수 없는 사용자 2012. 9. 18. 21:51

 흔히들 쉘 프로그래밍 하면 터미널에서 CUI로 구동되는 어플리케이션을 떠올리곤 합니다. 

 저 역시 쉘 프로그래밍하면 그러한 모습을 먼저 떠올리곤 합니다.^^ 하지만 쉘 프로그래밍 + dialog 유틸을 활용 하면 간단한 GUI 어플리케이션을 쉽게 작성 할 수 있습니다 . 

 화려한 GUI를 제공 할 순 없지만, 간단한 프로토 타입을 작성 할 때 아주주 강력한 모습을 보여 준다고 생각합니다. 그럼 쉘과 dialog 유틸을 이용해서 어떻게 GUI 어플리케이션을 작성하는지 알아 보도록 하겠습니다. 


1. 쉘 프로그래밍

 먼저 쉘 프로그래밍에 대해서 간단히 알아 보겠습니다. 

유닉스(또는 리눅스)에서 대화형 사용자 인터페이스를 부르는 용어이다. 쉘은 프로그래밍 계층에 있으면서 사용자가 입력하는 명령어를 이해하고, 실행하는 역할을 수행한다. 시스템에 따라서는 쉘을 명령어 해석기라고 부르는 경우도 있다. 쉘은 보통 명령어 문법에 맞추어 이용하는 인터페이스를 가진다(DOS 운영체계의 C:\>라는 프롬프트와  dir, eidt등과 같은 사용자 명령어를 생각하면 이해가 쉬울 것이다. 

 쉘은 운영체계의 외곽계층으로서, 운영체계의 가장 안쪽계층이면서 서비스의 핵심을 담당하는 커널과 자주 비교하여 설명된다.※ terms.co.kr/shell.htm

 이라고 합니다. 쉽게 생각하면 윈도우의 프롬프트와 같은 모습입니다만 쉘은 훨 씬 강력한 기능을 자랑합니다. 

 '<' 와 '>' 을 이용한 입출력 재지정이 가능하고  ' | ' 를 이용하여 동시에 실행되는 프로그램들이 자료를 주고 받도록 할 수 있습니다. 부분 프로세스의 출력을 $(...)로 갈무리 하는  것도 가능합니다. 이러한 특징들이 오래전부터 작성되어 사용되어지고 있는 쉘 유틸들을 한데 묶어 새로운 유틸 또는 자신만의 작업을 편리하게 만드는 스크립트를 작성 할 수 있도록 해줍니다. 


※ 쉘과 커널의 관계를 그림으로 표현한 것 입니다. 


또한 리눅스는 모듈식 구조라서 서로 다른 쉘들 중 하나를 임의로 사용 할 수 있습니다. sh,bash,csh,ksh 등등 여러 쉘이 있지만 저는 가장 널리 쓰이기도하고 제가 사용하는 우분투의 기본 쉘인 bash를 사용하겠습니다. 


언제나 시작은 hello world 겠죠?


쉘은 이런식으로 명령행에서 대화 식으로도 가능하고 


이렇게 스크립트 파일을 만들어서 실행해도 됩니다. 


쉘 프로그래밍의 문법은 C 나 그외 객체지향 언어를 배우신 분들에게는 아주 쉬 울 것 입니다. 문법이 훨씬 간단하고 배우기도 쉽기 때문입니다. 


간단한 계산기를 하번 작성 해 보겠습니다. 


첫줄을 보시면 #!/bin/bash 가 보입니다. 본래 #부터 줄끝까지는 주석을 의미하는데 첫줄의 #!/bin/bash는 실행 가능한 스크립트라는 표시를 하는 관례 입니다. 


실행하는 모습입니다. 

chmod +x [스크립트파일명] 으로 실행가능하도록 파일을 변경하고 나면 간단히 실행할 수 있습니다.

C나 다른 객체 지향 언어를 하신 분들이라면 $1, $2가 굉장히 혼란 스러울 수 있습니다.  이건 매개변수 참조 변수라는 것으로 쉘이 받은 매개변수를 가르키는 변수 입니다. 

 

간단한 쉘 스크립트 예를 한번 보았습니다. 

더욱 자세 한 문법과 쉘 스크립트에 관한 정보와 예제는 여기 서 참조 하실수 있습니다. 


2.dialog 

 dialog 유틸의 개념은 간단합니다. 다양한 매개변수들과 옵션들을 가진 하나의 단일한 프로그램을 이용해서 간단한 예/아니요 상자나 입력상자, 메뉴 선택 등 다양한 종류의 GUI를 표시한다는 것 입니다. 이 유틸리티는 사용자가 어떤 선택이나 입력을 하면 반환되고 스크립트는 선택의 결과를 이 유틸리의 종료 코드로 얻을 수 있습니다. 또한 이 유틸리티가 표준 오류 스트림에 출력한 텍스트를 얻는 것도 가능합니다.

 

우선 dialog를 기본으로 설치하지 않는 경우가 많기때문에 설치를 하셔야 할 것 입니다. 

 우분투에서는 

sudo apt-get install dialog

 라는 명령으로 손쉽게 설치가 가능합니다.


설치가 끝났으면 간단한 테스트를 해보겠습니다.


라고 입력을 하시면



이런 모습을 확인 하실 수 있습니다. 쉽죠?

명령줄에서도 쉽게 직접 실행 할 수 있어서 빠른 프로토 타이핑에도 적합합니다. 


다음은 이 유틸리티로 만들 수 있는 주요 대화상자 들입니다. 


 종류 

 사용할 옵션 

 설명 

 체크 상자 

 --checklist 

 일단의 선택 항목들을 표시한다. 여러 항목들을 개별적으로 체크 할 수 있다. 

 정보 상자 

 --infobox 

 간단한 메시지를 표시하되 화면을 지우지 않고 즉시 반환된다. 

 입력 상자 

 --inputbox 

 텍스트를 입력받는다. 

 메뉴 상자 

 --menu 

 일단의 메뉴 항목들 중 하나를 선택하게 한다. 

 메시지 상자 

 --msgbox 

 메시지를 표시한다. 사용자가 OK 버튼을 클릭하면 반환된다. 

 라디오 선택 상자 

 --radiolist 

 일단의 선택 항목들을 표시한다. 한 번에 하나의 항목 만 선택할 수 있다. 

 텍스트 상자 

 --textbox 

 파일의 내용을 표시한다. 스크롤을 지원한다. 

 예/아니요 상자 

 --yesno 

 예 또는 아니요로 답할 수 있는 질문을 던질 때 쓰인다. 


이 외에도 여러 종류의 대화상자들이 있습니다. 

더 자세한 내용은 메뉴얼 페이지를 보시기 바랍니다. 메뉴얼 페이지를 보는 방법은 아래와 같습니다.  

man dialog


3. 응용

그럼 사용자의 입력을 받아서 처리 할 수 있는 간단한 응용을 해 보겠습니다. 학번을 입력받고 간단한 학생정보를 입력받아서 파일에 데이터를 기록 해 보도록 하겠습니다. 





4번째 줄은 간단한 메시지를 띄우는 모습입니다. 


8번째 줄의 $? 은  6번째 줄에서 실행한 dialog의 종료코드를 받아오는 환경 변수입니다. 종료코드가 0(쉘에서는 0이 성공입니다.) 이면 사용자가  "예"라는 응답을 한 것입니다. 


17번째 줄에서는 $(...) 으로 dialog의 inputbox로 받은 입력을  갈무리하였습니다. 이때  --stdout 출력스트림을 지정하였습니다. 이 옵션을 제거 하면 표준 오류 스트림으로 inputbox의 내용이 출력되도록 되어 있습니다. 


20번째 줄에서는 여러개의 입력데이터를 받기 위해 --from을 사용 하였습니다. 마찬가지로 출력 스트림을 stdout로 지정하고 갈무리 하였습니다. 


22~24번째 줄에서는 19번째 줄에서 갈무리한 문자열 들을 대상으로 for 루프를 돌면서 파일에 쓰는 모습입니다. 




실행을 한 모습입니다. 


몇줄 안되는 코드로  사용자로부터 입력을 받아서 파일에 저장하는 간단한 GUI 어플리케이션을 쉘 프로그래밍을 통해서 만들어 보았습니다. 생각 보다 쉽고 빠르게 프로그램을 작성 할 수 있습니다.  

더욱 자세한 정보는 여기서 


4. 마치며

 쉘을 만지다 보면 쉘 그자체로도 꽤 쓸만한 프로그래밍 언어라는걸 느끼실 것입니다. 다른 프로그램을 쉽게 호출하고 출력을 갈무리 하는 능력, 손쉬운 파일 처리 덕분에 여러 모로 쓸모가 많습니다. 

리눅스에서 시스템을 관리할때 반복적인 작업이나 작은 유틸리티 프로그램을 만들때 쉘을 이용해 보시기 바랍니다. 



[참고문헌 및 웹]


- Beginning Linux Programming, 4th Edition

http://wiki.kldp.org/wiki.php/ShellProgrammingTutorial

http://invisible-island.net/