메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

Speaking UNIX: 쉘 스크립트로 훌륭한 그래픽 애플리케이션 작성하기

Martin Martin, 소프트웨어 개발자, Pixel, Byte, and Comma
Martin Streicher사진
Martin Streicher는 프리랜서 Ruby on Rails 개발자이며 Linux Magazine의 편집장을 역임했다. Purdue University에서 컴퓨터 과학 석사 학위를 받았으며 1986년부터 UNIX 계열 시스템을 프로그래밍하고 있다. 그리고 그는 예술 작품과 장난감 수집을 좋아한다. 이메일 주소는 martin.streicher@gmail.com이다.

요약:  모든 사용자에게 명령행이 적합하지는 않습니다. 실제로 일부 사용자들은 마우스가 갖추어져 있어야만 편하게 느낄 수 있습니다. 이러한 사용자를 수용하거나 쉘만 사용하여 사용자 정의 데스크탑 애플리케이션을 빌드하려면 GUI를 스크립트에 추가하십시오. 수행하는 방법은 다음과 같습니다.

원문 게재일:  2011 년 6 월 17 일
난이도: 중급 원문:  보기 PDF:  A4 and Letter (135KB | 12 pages)Get Adobe® Reader®
페이지뷰:  1853 회
의견:  


붐비는 컴퓨터실에 들어가면, "shebangs", 슬래시, 점(dot), 루트, 파이프, 포트 및 대시(dash) 등에 대한 잡담에 끼어들게 된다. UNIX®를 논하면 현장의 용어—약어, 명령 이름, 단축키, 옵션, 파일 이름 및 UNIX에 대한 구어적 표현—에 대해 친근감을 느끼고 편안해질 것이다. 다른 기술 종사자와 마찬가지로, UNIX 사용자들도 본인 작업의 구체성을 설명하기 위해 광범위한 고유 언어가 있다.

자주 사용하는 약어

  • GUI: Graphical user interface
  • HTML: Hypertext Markup Language

하지만, 모든 사람이 UNIX에 대해 논하지는 않는다. 실제로 어떤 사람들은 명령행이 어렵고 당혹스럽다고 생각하기도 한다. 더 나아가 정기적으로 사용하지 않거나 숙련되지 않은 사용자에게 명령행 전체를 맡기지 않으려 할 수 있다. 명령행에 익숙하지 않은 경우를 지원하고 쉘 관련 사용자 정의 솔루션을 빌드하기 위해 스크립트용 GUI를 빌드할 수 있다. 이러한 도구—dialog 및 Zenity가 언급할 만한 두 가지이다(참고자료 참조)—를 통해, 사용자와 상호 작용하기 위해 대화 상자, 파일 브라우저 및 다른 일반적인 "윈도윙(windowing)" 제어 및 기술을 사용할 수 있다. 실로 대화 상자는 더 자연스러운 대화를 위해 제공한다. 즉, 독자는 정보를 표시하고 응답을 요청하며 이에 따라 반응한다.

이러한 "Speaking UNIX" 편은 dialog 및 Zenity를 살펴보고, 스크립트에 상관없이 확실한 GUI 애플리케이션으로 어떻게 변환할 수 있는지 보여준다. 기존의 텍스트 기반 인터페이스로 dialog를 사용할 수 있는 반면, Zenity는 현대적인 윈도우 방식 데스크탑 스타일을 제공한다.

대화 상자를 어느 쉘 스크립트로나 추가

명령행 유틸리티는 대개 각각의 호출을 완전히 제어하는 충분한 옵션을 제공한다. 일부 스위치는 기능을 사용하거나 사용 안함으로 할 수 있는 반면, 다른 스위치는 이름 목록과 같이 인수를 처리할 수 있다. 명령행에서 (거의) 모든 정보를 전면에 표시하고 작업을 진행시킬 수 있다. 그래픽 애플리케이션은 매우 다르다. 메뉴, 선택란 및 파일 브라우저를 통해 선택한다. 그래픽 애플리케이션은 소량의 정보를 취하여 이를 처리한 다음에 대개 더 많은 정보를 요청한다. GUI 애플리케이션은 이벤트 구동이라고 한다.

dialog 유틸리티는 두 단계에 걸쳐 이뤄진다. 사용자로부터 입력이 필요할 때마다 유틸리티를 호출한 다음에 제공된 데이터가 무엇이든지 처리를 계속하도록 스크립트로 리턴한다. 다시 말해서, dialog를 사용하기 위해 스크립트를 쓰면, 명령행 인수를 무시할 가능성이 높고 대신에 필요할 때에 정보를 프롬프트로 표시하도록 dialog를 사용할 것이다.

시스템에 dialog 유틸리티가 없으면, 배포의 자체 패키지 관리자로 이를 간편하게 설치하거나 소스에서부터 직접 빌드할 수도 있다. 예를 들어, 시스템이 Aptitude를 사용하면 다음 명령으로 dialog를 설치할 수 있다.

sudo apt-get install dialog

그 외에 소스로부터 빌드하려면 유지보수자인 Thomas Dickey의 웹 사이트(참고 자료 참조)에서 코드를 다운로드하고 일반적인 다음 세 가지 명령을 실행한다. 즉, 이는 ./configure && make && make install이다.

$ wget http://invisible-island.net/datafiles/release/dialog.tar.gz
$ tar xzf dialog.tar.gz
$ cd dialog-1.1-20100428
$ ./configure
$ make
$ sudo make install

설치 이후에 경로에 dialog라는 이름의 새 유틸리티가 있어야 한다. man dialog를 입력하여 번들된 문서를 확인한다.

dialog를 사용하는 것은 간단하다. 즉, 이는 또 하나의 UNIX 명령에 불과하다. 명령 옵션을 사용하여 선택한 대화 상자를 표시한 다음에 결과를 캡처하고 그 값을 기반으로 일부 로직을 수행한다. dialog의 일부 변형은 명령행의 결과가 직접 특수 쉘 상태 변수인 $?에 놓는다. 이는 dialog 명령이 종료된 후에 즉시 저장하거나 정보를 얻어야 한다(왜냐하면 후속 명령이 즉시 그 값을 변경할 것이기 때문에). 또한, 일반적으로 dialog 명령의 더 복잡한 변형은 쉘 상태 변수를 설정하고 다른 결과를 생성한다. 간단히 하기 위해서 dialog는 항상 결과를 표준 결과물로 생성하기 위해 --stdout 옵션을 제공하여, 명령 평가로 캡처 데이터를 간편하게 만든다(이전 인용에서 명령과 지정 명령문의 조합).

예를 들어, 명령 dialog --yesno는 가장 간단한 변형 중 하나이다. 이는 질문을 표시하고 예 또는 아니오 응답에 대한 프롬프트를 표시하며 사용자가 "예(Yes)" 또는 "아니오(No)"를 선택하였는지 여부에 따라 $?에서 각각 0 또는 1 중 하나를 리턴한다. $?의 값을 테스트하고 일부 조건부 코드를 실행할 수 있다. 쉘 스크립트로 추가할 수 있는 작업 스니펫은 다음과 같다.

dialog --yesno "Do you want to continue?" 0 0
rc=$?
if [ "${rc}" == "0" ]; then
  echo Yes
else
  echo No
fi

--yesno 옵션은 최소한 세 개의 인수가 필요하다. 즉, 이는 질문에 대한 텍스트, 행과 열로 측정되는 대화 상자 자체의 높이 및 너비이다. 특정 차원이 필요하지 않으면, 대화 상자를 자동으로 크기 조정하기 위해 높이나 너비 둘 중 하나에 대해 항상 0을 사용할 수 있다. (창의 맨 위 왼쪽 모서리에 관련된 창을 놓기 위한 옵션도 있다.)그림 1은 작동 중인 --yesno를 보여준다.


그림 1. --yesno 연산
--yesno 연산

dialog 옵션인 --calendar는 사용자가 특정 날짜를 선택할 수 있도록 달력을 표시한다. 사용자가 날짜를 선택한 다음 OK를 클릭하면 명령이 0을 리턴한다. 하지만, 사용자가 Cancel을 클릭하면, 명령은 1을 리턴한다. 게다가 사용자가 OK를 클릭하면 명령은 표준 결과물로 선택한 날짜를 생성한다. 날짜를 산출하기 위해 명령 평가를 사용하는 예제는 다음과 같다.

RESULT=`dialog --stdout --title "CALENDAR" 
    --calendar "Please choose a date..." 0 0 9 1 2010`
retval=$?

--title 옵션은 대화 상자로 제목을 추가하기 위해 다음 인수를 사용하고 어느 dialog 명령이든지 사용할 수 있다. --yesno와 마찬가지로 사용자에게 프롬프트를 표시하기 위해 일부 텍스트를 제공한다. 그 다음에 0 0 옵션이 다시 높이와 너비를 자동으로 지정하고, 9 1 2010 옵션은 달력에 표시된 대로 처음의 일, 월, 년을 각각 지시한다. 탭과 화살표 키는 달력을 변경하고 날짜를 선택한다. 대화 상자가 닫힌 후에 retval0이면, RESULT의 값은 선택한 날짜이다. 그림 2는 달력 대화 상자를 보여준다.


그림 2. 달력 대화 상자
달력 대화 상자

dialog 명령은 다음과 같이 그래픽 애플리케이션에서 일반적으로 나타나는 대부분의 제어를 제공한다.

  • --infobox는 정보를 간단하게 표시한다. 즉, 이는 어느 입력도 예상하지 않는다. 정보 상자는 화면에 간략하게만 남아있다. 표시 장치를 연장하려면 sleep 명령과 다음 명령 사이에 sleep 명령을 둔다.
  • --input은 하나의 입력된 응답을 수집한다. 독자는 사용자의 이름 또는 우편번호를 수집하기 위해 이 명령을 사용할 수 있다.
  • --textbox는 텍스트 파일의 컨텐츠를 표시한다. 파일이 대화 상자의 세로 높이를 초과하면 제어가 간단한 위로 스크롤 및 아래로 스크롤을 허용한다.
  • --menu--radiolist는 선택한 목록을 표시하고 사용자가 하나를 선택하도록 허용한다. 두 종류의 대화 상자는 기능적으로 상응하지만, GUI로 표시 가능한 내용을 더 우수하게 시뮬레이션하기 위해 시각적 스타일이 약간 다르다. 특히, --radiolist 명령은 단일 선택 단추를 모방하기 위해 ( )를 렌더링한다.
  • --checklist는 사용자가 개별적으로 사용 또는 사용 안함 상태로 할 수 있는 항목 목록을 표시한다.

dialog 변형의 결과물은 다르지만, 하나의 값이거나 공백으로 구분된 인용된 값의 목록 중 하나이다. 예를 들어, 하나 이상의 옵션을 선택하는 데 훌륭한 --checklist는 인용된 값의 목록을 생성하며, 여기에서 각 값은 사용된 옵션과 연관된다. 예제는 다음과 같이 연산을 시연한다.

RESULT=`dialog --stdout 
   --checklist "Enable the account options you want:" 10 40 3 \
  1 "Home directory" on \
  2 "Signature file" off \
  3 "Simple password" off`

1, 2, 3행의 끝 부분에 백슬래시(\)는 연속이다. 반면, RESULT에서부터 off`까지는 모두 하나의 명령이다. 사용자가 Home directorySimple password를 사용하면, $RESULT"1" "3"이 될 것이다. --checklist로의 인수는 높이와 너비, 시점에 관계 없이 목록 요소의 수(일부가 차단되어 있으면 추가 항목을 확인하기 위해 스크롤할 수 있음) 및 체크리스트 옵션이며, 여기에서 각 옵션은 값, 설명 및 옵션이 초기에 사용 또는 사용 안함 상태가 되는지 여부이다.

시점에 관계 없이 일반 목록을 표시하기 위해 dialog --helpdialog별 옵션을 입력할 수 있다. dialog는 무수하게 사용된다.


픽셀이 있다면 Zenity를 사용하자.

dialog가 간단한 터미널 창이라면 Zenity는 UNIX 데스크탑과 같다. 어느 쉘 스크립트에서나 GTK+ 대화 상자를 열기 위해 Zenity를 사용할 수 있다. 사실, Zenity는 dialog와 동일한 기능을 많이 공유한다. 반면, 유일한 차이점은 Zenity가 X Window 시스템 환경에서 작동한다는 점이다. Zenity는 GNOME와 함께 번들로 제공된다. GNOME를 실행하지 않는 경우, Zenity를 별도로 설치할 수 있다(하지만, GTK+ 라이브러리가 많이 설치되는 것도 예상하자). GNOME 프로젝트 페이지에서부터 Zenity의 소스를 다운로드할 수도 있다(링크는 참고자료 참조).

여기에 빠른 예제가 있다. 명령은 다음과 같다.

zenity --question --text "Do you want to continue?"

이는 그림 3과 유사하게 제작한다. (시연을 위해 사용되는 시스템은 Ubuntu 10을 실행하는 중이다.) OK를 클릭하면 명령이 0을 리턴한다. 그렇지 않으면 이는 1을 리턴한다.


그림 3. 간단한 질문
간단한 질문

dialog와 마찬가지로, Zenity는 옵션이 매우 많다—아마 dialog보다 훨씬 더 많을 것임— 하지만 그 옵션은 이름이 올바르게 지정되어 자체 설명적이다. 특히, 대부분의 컴퓨터 사용자가 X 데스크탑류를 보유하기 때문에 Zenity가 dialog보다 더 유리하다고 생각할 가능성이 높다.

Zenity는 dialog와 동일한 제어를 많이 제공한다. 다음은 이름을 수집하기 위한 스니펫이다.

ENTRY=`zenity --entry --text "Please enter your name" 
   --entry-text "Your name" --title "Enter your name"
if [ $? == 0 ]; then
  zenity --info --text "Hello $ENTRY\!"
fi

다시, zenity의 종료 코드가 0이면, ENTRY는 개인의 이름을 가진다. Zenity를 사용하기 위해 다시 쓴 위의 달력 예제는 다음과 같다.

DATE=`zenity --calendar --day "9" --month "1" --year "2010" --format "%Y-%m-%d"
if [ $? == 0 ]; then
  echo $DATE
fi

Zenity가 약간 더 장황하긴 하지만—예를 들어, 일, 월, 년의 개별 옵션이 있음— 추가 스위치로 인해 인수의 정확한 사용 순서를 기억하지 않아도 된다. Zenity의 달력도 표준 strftime() 코드를 사용하여 결과물의 형식을 지정하도록 허용한다. 이 명령의 결과는 2010년 1월 9일에 대해 2010-1-9과 유사하게 될 것이다.

Zenity도 진행률 미터를 제공하여 연산의 상태를 보여준다. 이는 표준 입력에서부터 한 행씩 데이터를 읽는다. 행이 넘버 기호 또는 우물정 부호(#)로 접두부 처리되면, 텍스트는 그 행에서 텍스트로 업데이트된다. 행에 숫자만 들어있으면 백분율이 그 숫자로 업데이트된다. 목록 1은 Zenity 문서에서 나온 예제이다.


목록 1. Zenity 진행률 미터
	
#!/bin/sh
(
  echo "10" ; sleep 1
  echo "# Updating mail logs" ; sleep 1
  echo "20" ; sleep 1
  echo "# Resetting cron jobs" ; sleep 1
  echo "50" ; sleep 1
  echo "This line will just be ignored" ; sleep 1
  echo "75" ; sleep 1
  echo "# Rebooting system" ; sleep 1
  echo "100" ; sleep 1
) |
zenity --progress \
  --title="Update System Logs" \
  --text="Scanning mail logs..." \
  --percentage=0

if [ "$?" = -1 ] ; then
  zenity --error \
    --text="Update canceled."
fi

서브쉘(소괄호로 둘러쌈)은 태스크의 시리즈를 수행하고—이 고안된 예제에서 절전이 지연됨에도 불구하고— 파이프를 통해 결과물을 Zenity 진행률 미터로 생성한다. 각 단계 이전에 서브쉘은 진행률 미터를 능가하기 위해 숫자를 생성하며, 이는 --percentage 00에서 시작한 다음에 상태 메시지를 변경하기 위해 #으로 시작되는 문자열을 생성한다. 그러면 진행률 미터는 스크립트의 작업을 표시하는 단계를 따른다. Zenity가 -1 코드로 종료되면, Cancel 단추가 클릭된 것이다.

다시, dialog 또는 Zenity를 사용하려면, 이전에 대화 상자로 명령행 인수를 참조한 코드를 바꾼다. 약간의 창의성을 발휘하여 쉘 스크립트를 최상급 데스크탑 구성원으로 변환시킬 수 있다.


추가 고급 도구

특정 시점에 사용자 요구사항이 쉘 스크립팅과 dialog 및 Zenity 도구 둘 다의 기능을 능가한다는 것을 알 수 있다. 이러한 인스턴스에서 C/C++로 변화하고 데스크탑용 기본 애플리케이션을 빌드할 수 있지만, 견고한 GUI 프레임워크의 수에 관계 없이 이에 대해 고급 스크립팅 언어와 언어 바인딩으로 변화시킬 수도 있다.

하나의 조합은 wxWidgets 프레임워크에 대한 Ruby 스크립팅 언어와 Ruby 바인딩이다. Ruby는 오브젝트 지향적이고 표현적이며 간결하고 대부분의 운영 체제에서 실행한다. wxWidgets 프레임워크도 Mac OS X, Windows®, Linux® 및 UNIX를 비롯한 모든 주요 플랫폼에서도 사용할 수 있다. 둘 다 휴대용이기 때문에, Ruby에서 한 번 애플리케이션을 쓰면 어디서나 이를 실행할 수 있다. 또 다른 더 간단한 옵션은 Shoes이다. 비록 wxWidgets처럼 풍부하지 않지만, Shoes는 매우 빠르게 배우고 사용하게 된다. 목록 2의 코드가 70개의 코드 행에서 계산기를 인식한다.


목록 2. Shoes에서 계산기
	
class Calc
  def initialize
    @number = 0
    @previous = nil
    @op = nil
  end

  def to_s
    @number.to_s
  end

  (0..9).each do |n|
    define_method "press_#{n}" do
      @number = @number.to_i * 10 + n
    end
  end

  def press_clear
    @number = 0
  end

  {'add' => '+', 'sub' => '-', 'times' => '*', 'div' => '/'}.each do |meth, op|
    define_method "press_#{meth}" do
      if @op
        press_equals
      end
      @op = op
      @previous, @number = @number, nil
    end
  end

  def press_equals
    @number = @previous.send(@op, @number.to_i)
    @op = nil
  end
end

number_field = nil
number = Calc.new
Shoes.app :height => 250, :width => 200, :resizable => false do
  background "#EEC".."#996", :curve => 5, :margin => 2

  stack :margin => 2 do

    stack :margin => 8 do
      number_field = para strong(number)
    end

    flow :width => 218, :margin => 4 do
      %w(7 8 9 / 4 5 6 * 1 2 3 - 0 Clr = +).each do |btn|
        button btn, :width => 46, :height => 46 do
          method = case btn
            when /[0-9]/; 'press_'+btn
            when 'Clr'; 'press_clear'
            when '='; 'press_equals'
            when '+'; 'press_add'
            when '-'; 'press_sub'
            when '*'; 'press_times'
            when '/'; 'press_div'
          end

          number.send(method)
          number_field.replace strong(number)
        end
      end
    end
  end
end

Ruby 및 Shoes에 대한 소개는 이 기사의 범위를 벗어나지만, 여기에 다음과 같이 가장 중요한 구축 중 일부가 나와 있다.

  • Ruby 클래스 Calc의 덩어리가 Ruby의 메타프로그래밍 기능을 사용하여 모든 숫자 키와 수학 연산 키에 대해 런타임 시 함수를 정의한다.
  • Shoes.app...으로 시작하는 코드는 계산기의 GUI를 작성하여, 이에 대한 레이아웃과 단추를 렌더링한다. Shoes는 레이아웃을 조립하기 위해 두 개의 컨테이너를 제공한다. 즉, stackflow이다. stack은 각 요소가 선행하는 요소 아래에 직접 위치 지정한 요소의 세로 스택이다. 테두리 있는 박스의 한계에 도달할 때까지 flow는 가능한 한 빽빽히 요소를 압축한 다음에 나머지 요소를 랩핑한다. (스택을 HTML <div>로 생각하고 플로우를 HTML <p>로 생각할 수 있다.) Ruby 블록을 사용하여 스택이나 플로우를 작성한다.
  • 가장 안쪽의 flow 블록이 루프하여, 애플리케이션의 단추를 모두 작성하고 각 단추를 메소드로 효율적으로 바인딩한다. (case 명령문은 메소드 이름을 리턴한다. 반면, number.send(method) 행은 인스턴스화된 계산기에서 해당 메소드를 호출한다.)
  • number_field.replace strong(number) 행은 계산기 표시장치를 가장 최근 계산 결과로 업데이트한다. number를 생성하면 클래스가 자체적인 to_s("문자열로") 메소드를 호출하게 된다.

다른 스크립팅 언어는 유사한 라이브러리가 있고, Ruby로 Mac OS X에서 Cocoa 애플리케이션을 개발하기 위한 Ruby Cocoa를 비롯하여 Ruby 자체를 위한 선택이 더 많다. 즐겨찾는 오픈 소스 스크립팅 언어를 선택하여, 경량 GUI 툴킷을 찾고 코딩을 시작하자.


골치 아픈 컴파일러는 전혀 필요하지 않다!

이미 쉘 스크립팅에 숙달되었다면 작업을 dialog 또는 Zenity와 결합하여 대화식 작업을 추가하자. 그리고 쉘이 제공하는 것보다 프로그래밍 성능이 더 많이 필요하면, Ruby나 Python 및 다른 몇 가지 윈도윙 툴킷 중 하나의 언어를 고려해보자. 훌륭한 데스크탑 애플리케이션을 쓰기 위한 컴파일러는 필요하지 않다.


참고자료

교육

  • Speaking UNIX: 본 시리즈의 다른 파트를 살펴본다.

  • wxWidgets: 교차 플랫폼 GUI 프레임워크인 wxWidgets에 대해 자세히 읽어보자.

  • AIX와 UNIX developerWorks 영역: AIX와 UNIX 영역에서는 AIX 시스템 관리와 UNIX 스킬 확장의 모든 측면과 관련된 풍부한 정보를 제공한다.

  • AIX와 UNIX 입문 AIX와 UNIX 입문 페이지에서 자세한 정보를 볼 수 있다.

  • 기술 서점: 다양한 기술 주제와 관련된 서적을 살펴볼 수 있다.

제품 및 기술 얻기

  • dialog 프로젝트 페이지: dialog의 소스 코드를 다운로드하자.

  • Zenity: GNOME 프로젝트 페이지에서부터 Zenity의 소스 코드를 얻을 수 있다.

  • Shoes: Shoes, Ruby의 GUI 라이브러리로 애플리케이션을 스크립트하는 방법에 대해 배워보자.

토론

필자소개

Martin Streicher사진

Martin Streicher는 프리랜서 Ruby on Rails 개발자이며 Linux Magazine의 편집장을 역임했다. Purdue University에서 컴퓨터 과학 석사 학위를 받았으며 1986년부터 UNIX 계열 시스템을 프로그래밍하고 있다. 그리고 그는 예술 작품과 장난감 수집을 좋아한다. 이메일 주소는 martin.streicher@gmail.com이다.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=AIX와 UNIX
ArticleID=681313
ArticleTitle=Speaking UNIX: 쉘 스크립트로 훌륭한 그래픽 애플리케이션 작성하기
publish-date=06172011
author1-email=martin.streicher@gmail.com
author1-email-cc=

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.