터미널 기반 GUI를 작성하는 방법


50

Bash 스크립트 를 적용 할 터미널 기반 환경을 만들고 싶습니다 . 나는 다음과 같이 보이기를 원한다.

데비안 설치


4
로 봐 dialog이 사용 표시되는 내용이다.
DopeGhoti


터미널 기반 GUI는 TUI라고 생각합니다 (CLI와는 다릅니다).
UniversallyUniqueID

"tui"는 RH 용어 IIRC입니다. whiptail> dialog또한
Bratchley

@Bratchley : GDB는 tui분할 창 모드 (예 : 레지스터, 소스 및 명령 표시 layout reg) 및 tui reg vecreg 창에서 벡터 레지스터를 표시하기 위해 사용합니다 (유연하지 않은 방식으로 부품이 실제로 유용하지 않음 : /) Redhat이이 기능을 추가 한 패치 또는 그 기능을 추가 한 패치를 작성한 경우 – IDK
Peter Cordes

답변:


42
dialog --backtitle "Package configuration" \
       --title "Configuration sun-java-jre" \
       --yesno "\nBla bla bla...\n\nDo you accept?" 10 30

여기에 이미지 설명을 입력하십시오

사용자 응답은 종료 코드에 저장되므로 평소와 같이 인쇄 할 수 있습니다 echo $?( 0"yes" 를 의미 1하며 쉘 세계에서는 "no"임).


의견 섹션의 다른 질문에 대해 :

  • 대화 상자에 일부 명령의 출력을 넣으려면 명령 대체 메커니즘을 사용하십시오 $().

     dialog --backtitle "$(echo abc)" --title "$(cat file)" ...
    
  • 사용자에게 여러 가지 선택을 제공하기 위해 --menu대신 옵션을 사용할 수 있습니다--yesno

  • 사용자 선택의 출력을 변수에 저장하려면 --stdout옵션 을 사용 하거나 출력 설명자를 통해 --output-fd또는 수동으로 변경 해야합니다. 예 :

    output=$(dialog --backtitle "Package configuration" \
                    --title "Configuration sun-java-jre" \
                    --menu "$(parted -l)" 15 40 4 1 "sda1" 2 "sda2" 3 "sda3" \
             3>&1 1>&2 2>&3 3>&-)
    echo "$output"
    

    이 트릭은 dialog기본적으로 stdout이 아닌 stderr로 출력 되기 때문에 필요합니다 .

그리고 언제나처럼, man dialog당신의 친구입니다.


저것은 아름다운 "Bla bla bla ..."이지만 어떻게 출력을 포착합니까?
tempforFind in the Woods

1
출력에 의해 종료 코드를 의미하는 경우 @tempforFindMeInTheWoods : 평소와 같이 : ?변수 안에 저장됩니다 echo $?.
jimmij

1
@tempforFindMeInTheWoods parted -l대화 상자를 통해 사용자에게 명령 출력을 표시하려면 옵션 --menu대신에 옵션을 선택하는 것이 좋습니다 -yesno. 이러한 경우 출력을 변수에 저장하려면 설명자와 함께 비트를 재생해야합니다.output=$(dialog --backtitle "Package configuration" --title "Configuration sun-java-jre" --menu "$(parted -l)" 15 40 4 1 "sda1" 2 "sda2" 3 "sda3" 3>&1 1>&2 2>&3 3>&-); echo $output
jimmij

3
또는 --stdout옵션을 사용할 수 있습니다 .
토마스 디키

2
모든 대화 옵션은 매뉴얼에 설명되어 있습니다 :man dialog
Ferrybig

34

질문의 스크린 샷은 휩 테일처럼 보입니다 ( ncurses 대신 newt를 사용하여 대화 상자를 모방 한 기능 감소 프로그램 ). 제목과 버튼이 렌더링되는 방식이 각 프로그램에 내장되어있어 다르게 보입니다.

다음은 채찍이나 대화에 대한 원래 스크린 샷을 복제하는 스크립트입니다.

#!/bin/sh
: ${DIALOG:=dialog}
case "$DIALOG" in
*dialog*)
        OPTS="$OPTS --cr-wrap"
        high=10
        ;;
*whiptail*)
        high=12
        ;;
esac
rows=$(stty size | cut -d' ' -f1)
[ -z "$rows" ] && rows=$high
[ $rows -gt $high ] && rows=$high
cols=$(stty size | cut -d' ' -f2)
$DIALOG --backtitle "Package configuration" \
       --title "Configuring sun-java6-jre" \
       $OPTS \
       --yesno '\nIn order to install this package, you must accept the license terms, the "Operating System Distributor License for Java" (DLJ), v1.1. Not accepting will cancel the installation.\n\nDo you accept the DLJ license terms?' $rows $((cols - 5))

비교를 위해 whiptail을 사용한 스크린 샷 :

채찍으로 스크린 샷

대화 상자와 함께 :

대화 상자가있는 스크린 샷

제목과 버튼의 다른 모양 외에도 대화 상자는 기본적으로 다른 색상을 사용하지만 (구성 할 수는 있지만 스크린 샷 참조 ) 화면에서 줄 수를 줄입니다.

대화 상자 (및 채찍)는 선, 색상 등의 표시를 관리하기 위해 라이브러리를 사용합니다. 그러나 Red Hat 아나콘다 프로그램에서 사용 된 newt를 파이썬 에서 공유 라이브러리로 사용하는 것을 볼 수도 있습니다 (같은 모양). 같은 줄을 따라 커널 구성 프로그램은 대화 상자의 (절단) 복사본으로 시작한 다음 lxdialog파이썬에서 newt를 사용하는 방식과 같이 공유 프로그램 (원본 프로그램 없이)을 사용하여 기능으로 발전했습니다 .

bash에서 — 가장 일반적으로 사용되는 기능에 대해 대화 상자 나 휘장을 사용할 수 있습니다. 누군가는 (펄에서) 그것들을 위해 래퍼를 작성하여 스크립트가 그것들이나 다른 것들을 더 쉽게 사용할 수 있도록 만들었지 만, 펄 모듈은 본질적으로 공통 분 모이기 때문에 대화 상자를 직접 사용하는 것이 좋습니다.

대화 상자 소스에는 대부분의 명령 행 옵션과 함께 모든 위젯의 예제가 포함되어 있습니다.

cdialog (ComeOn Dialog!) version 1.3-20160424
Copyright 2000-2015,2016 Thomas E. Dickey
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

* Display dialog boxes from shell scripts *

Usage: cdialog <options> { --and-widget <options> }
where options are "common" options, followed by "box" options

Special options:
  [--create-rc "file"]
Common options:
  [--ascii-lines] [--aspect <ratio>] [--backtitle <backtitle>] [--beep]
  [--beep-after] [--begin <y> <x>] [--cancel-label <str>] [--clear]
  [--colors] [--column-separator <str>] [--cr-wrap] [--date-format <str>]
  [--default-button <str>] [--default-item <str>] [--defaultno]
  [--exit-label <str>] [--extra-button] [--extra-label <str>]
  [--help-button] [--help-label <str>] [--help-status] [--help-tags]
  [--hfile <str>] [--hline <str>] [--ignore] [--input-fd <fd>]
  [--insecure] [--item-help] [--keep-tite] [--keep-window] [--last-key]
  [--max-input <n>] [--no-cancel] [--no-collapse] [--no-cr-wrap]
  [--no-items] [--no-kill] [--no-label <str>] [--no-lines] [--no-mouse]
  [--no-nl-expand] [--no-ok] [--no-shadow] [--no-tags] [--nook]
  [--ok-label <str>] [--output-fd <fd>] [--output-separator <str>]
  [--print-maxsize] [--print-size] [--print-version] [--quoted]
  [--scrollbar] [--separate-output] [--separate-widget <str>] [--shadow]
  [--single-quoted] [--size-err] [--sleep <secs>] [--stderr] [--stdout]
  [--tab-correct] [--tab-len <n>] [--time-format <str>] [--timeout <secs>]
  [--title <title>] [--trace <file>] [--trim] [--version] [--visit-items]
  [--week-start <str>] [--yes-label <str>]
Box options:
  --buildlist    <text> <height> <width> <list-height> <tag1> <item1> <status1>...
  --calendar     <text> <height> <width> <day> <month> <year>
  --checklist    <text> <height> <width> <list height> <tag1> <item1> <status1>...
  --dselect      <directory> <height> <width>
  --editbox      <file> <height> <width>
  --form         <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>...
  --fselect      <filepath> <height> <width>
  --gauge        <text> <height> <width> [<percent>]
  --infobox      <text> <height> <width>
  --inputbox     <text> <height> <width> [<init>]
  --inputmenu    <text> <height> <width> <menu height> <tag1> <item1>...
  --menu         <text> <height> <width> <menu height> <tag1> <item1>...
  --mixedform    <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1> <itype>...
  --mixedgauge   <text> <height> <width> <percent> <tag1> <item1>...
  --msgbox       <text> <height> <width>
  --passwordbox  <text> <height> <width> [<init>]
  --passwordform <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>...
  --pause        <text> <height> <width> <seconds>
  --prgbox       <text> <command> <height> <width>
  --programbox   <text> <height> <width>
  --progressbox  <text> <height> <width>
  --radiolist    <text> <height> <width> <list height> <tag1> <item1> <status1>...
  --rangebox     <text> <height> <width> <min-value> <max-value> <default-value>
  --tailbox      <file> <height> <width>
  --tailboxbg    <file> <height> <width>
  --textbox      <file> <height> <width>
  --timebox      <text> <height> <width> <hour> <minute> <second>
  --treeview     <text> <height> <width> <list-height> <tag1> <item1> <status1> <depth1>...
  --yesno        <text> <height> <width>

Auto-size with height and width = 0. Maximize with height and width = -1.
Global-auto-size if also menu_height/list_height = 0.

더 읽을 거리 :


11

찾고있는 패키지는 ncurses 라고 생각합니다 .

Wikipedia 는 다음과 같이 ncurses를 설명합니다.

ncurses (새 curses)는 프로그래머가 터미널 기반 방식으로 텍스트 기반 사용자 인터페이스를 작성할 수있는 API를 제공하는 프로그래밍 라이브러리입니다. 터미널 에뮬레이터에서 실행되는 "GUI와 같은"애플리케이션 소프트웨어를 개발하기위한 툴킷입니다.

예를 들어 menuconfig 커널 구성 도구에서 널리 사용됩니다. Linux 커널 menuconfig 도구의 스크린 샷

bash를 사용하고 있으므로 Bash Simple Curses를 사용할 수 있습니다 (아래 주석에서 Runium이 언급 한대로).


11
ncursesC 라이브러리입니다. (올바로 이해하면) OP는 스크립트 환경 (bash)을 원합니다 . menuconfig에 대한 대안으로 dialog, 다른 답변 에 따라 bash로 작성된 Bash Simple Curses 를 언급 할 수 tput있습니다.
Runium

@Runium : 설명과 Bash Simple Curses 링크에 감사드립니다.
Thawn

2
아직도, ncurses이것의 기초 라는 것을 언급하는 것이 도움 이되었으며, 여기에 제목에있는 것과 같은 질문의보다 일반적인 버전에 대한 답변이 있습니다 :)
underscore_d

-1

선의

zenity --file-selection --directory

.

# var means variable

var\
=$(
zenity --entry                   \
       --title="title"           \
       --text="text"             \
       --entry-text="entry text" \ 
)                                \
&&
echo "$var"

.

# ls is a command to list files in a directory

ls $(zenity --file-selection --directory)

옵션이있는 zenity 대화 상자 항목

password=$(zenity --password)

zenity-암호

file="$(zenity --file-selection)"

zenity-파일 선택

zenity --help

zenity-도움말 결과

zenity --help-general 

선의-도움말 일반 결과

zenity --help-entry

zenity --help-entry 결과

다른 그래픽 사용자 인터페이스 (gui)

dialog

대화

dialog                               \
 --backtitle "backtitle"             \
 --title "title"                     \
 --yesno                             \
 "bla bla bla...\n\n Do you accept?" \
 0 -1                                
echo $?

스크립트의 추가 실행을 중지하고 중단합니다. 줄 : echo $? 결코 일어나지 않을 것이다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.