Làm cách nào để tạo GUI dựa trên thiết bị đầu cuối?


50

Tôi đang tìm cách tạo một môi trường dựa trên thiết bị đầu cuối để điều chỉnh tập lệnh Bash của tôi vào. Tôi muốn nó trông như thế này:

Cài đặt Debian


4
Nhìn vào dialog, đó là những gì nó xuất hiện để sử dụng.
DopeGhoti


Tôi nghĩ rằng GUI dựa trên thiết bị đầu cuối là TUI (khác với CLI).
Đại

"tui" là một thuật ngữ II II. whiptail> dialogcũng
Bratchley

@Bratchley: GDB cũng sử dụng tuicho chế độ chia cửa sổ của nó ( layout regví dụ hiển thị các thanh ghi, nguồn và lệnh và tui reg vecđể hiển thị các thanh ghi vector trong cửa sổ reg (theo cách không linh hoạt, do đó phần đó không thực sự hữu ích: /) IDK nếu Redhat viết bản vá có thêm tính năng đó, hoặc thậm chí nó bao nhiêu tuổi.
Peter Cordes

Câu trả lời:


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

nhập mô tả hình ảnh ở đây

Phản hồi của người dùng được lưu trữ trong mã thoát, do đó có thể được in như bình thường: echo $?(lưu ý 0có nghĩa là "có" và 1là "không" trong thế giới vỏ).


Liên quan đến các câu hỏi khác từ phần bình luận:

  • để đưa vào hộp thoại, đầu ra từ một số lệnh chỉ cần sử dụng cơ chế thay thế lệnh $(), ví dụ:

     dialog --backtitle "$(echo abc)" --title "$(cat file)" ...
    
  • để cung cấp cho người dùng nhiều lựa chọn, bạn có thể sử dụng --menutùy chọn thay vì--yesno

  • để lưu trữ đầu ra của lựa chọn người dùng vào biến người ta cần sử dụng --stdouttùy chọn hoặc thay đổi mô tả đầu ra thông qua --output-fdhoặc bằng tay, ví dụ:

    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"
    

    Thủ thuật này là cần thiết bởi vì dialogtheo mặc định đầu ra cho thiết bị xuất chuẩn, không phải thiết bị xuất chuẩn.

Và như mọi khi, man dialoglà bạn của bạn.


Thật là "Bla bla bla ..." nhưng làm thế nào để bạn nắm bắt được đầu ra?
tạm thời tìm tôi trong rừng

1
@tempforFindMeInTheWoods nếu theo đầu ra bạn có nghĩa là mã thoát, thì cũng giống như usuall: nó được lưu trữ bên trong ?biến, hãy thử echo $?.
jimmij

1
@tempforFindMeInTheWoods Nếu bạn muốn trình bày đầu ra của lệnh parted -lcho người dùng thông qua hộp thoại thì có lẽ tùy chọn --menulà lựa chọn tốt hơn thay vì -yesno. Trong trường hợp như vậy, bạn sẽ phải chơi một chút với các mô tả để lưu trữ đầu ra vào biến, ví dụ: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
Hoặc, bạn có thể sử dụng --stdouttùy chọn.
Thomas Dickey

2
Tất cả các tùy chọn hộp thoại được giải thích trong hướng dẫn sử dụng:man dialog
Ferrybig

34

Ảnh chụp màn hình trong câu hỏi trông giống như whiptail ( hộp thoại bắt chước chương trình giảm chức năng , sử dụng newt thay vì ncurses ). Cách tiêu đề và các nút được hiển thị được tích hợp vào mỗi chương trình, làm cho chúng trông khác nhau.

Đây là một đoạn script sao chép ảnh chụp màn hình gốc, cho cả whiptail hoặc hộp thoại:

#!/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))

và để so sánh, ảnh chụp màn hình với whiptail:

ảnh chụp màn hình với whiptail

và với hộp thoại:

ảnh chụp màn hình với hộp thoại

Bên cạnh sự xuất hiện khác nhau của tiêu đề và các nút, hộp thoại sử dụng các màu khác nhau theo mặc định (mặc dù đó là cấu hình, xem ảnh chụp màn hình ) và nó sử dụng ít dòng hơn trên màn hình.

hộp thoại (và whiptail) sử dụng các thư viện để quản lý hiển thị đường kẻ, màu sắc, v.v. Nhưng bạn cũng có thể thấy newt được sử dụng trong chương trình anaconda của Red Hat như một thư viện chia sẻ được gọi từ python (có cùng hình thức). Dọc theo cùng một dòng, chương trình cấu hình kernel bắt đầu như một bản sao (cắt xuống) của hộp thoại, sau đó phát triển thành các tính năng sử dụng thư viện dùng chung (không có lxdialogchương trình gốc ) giống như cách sử dụng newt từ python.

Từ bash - bạn có thể sử dụng hộp thoại hoặc whiptail cho các tính năng được sử dụng phổ biến nhất. Ai đó đã viết một trình bao bọc cho những người đó (tính theo perl) để cho phép các tập lệnh dễ dàng sử dụng hơn hoặc một số người khác, nhưng tốt hơn hết bạn nên sử dụng hộp thoại trực tiếp vì mô-đun perl về cơ bản là mẫu số chung.

Các nguồn hộp thoại bao gồm các ví dụ về tất cả các widget cùng với hầu hết các tùy chọn dòng lệnh:

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.

Đọc thêm:


11

Tôi tin rằng gói bạn đang tìm kiếm là ncurses .

Wikipedia mô tả các tài liệu như sau:

ncurses (lời nguyền mới) là một thư viện lập trình cung cấp API cho phép lập trình viên viết giao diện người dùng dựa trên văn bản theo cách độc lập với thiết bị đầu cuối. Nó là bộ công cụ để phát triển phần mềm ứng dụng "giống như GUI" chạy dưới trình giả lập thiết bị đầu cuối

Nó được sử dụng rộng rãi, ví dụ, trong công cụ cấu hình kernel menuconfig: Ảnh chụp màn hình của công cụ menuconfig nhân Linux

Vì bạn đang sử dụng bash, bạn có thể sử dụng Bash Simple Curses (như được đề cập bởi Runium trong bình luận bên dưới).


11
ncurseslà một thư viện C. (Nếu tôi hiểu chính xác) OP muốn có một môi trường tập lệnh (cho bash). menuconfigđược viết bằng C. Như một cách thay thế dialog, theo câu trả lời khác, có lẽ bạn có thể đề cập đến Bash Simple Curses được viết bằng bash (dựa vào tput).
Runium

@Runium: Cảm ơn bạn đã làm rõ và liên kết đến Bash Simple Curses.
Sáng

2
Tuy nhiên, thật hữu ích khi đề cập đến đó ncurseslà cơ sở của vấn đề này và nó trả lời một phiên bản chung hơn của câu hỏi ... giống như câu hỏi trong tiêu đề ở đây :)
underscore_d

-1

sự thoải mái

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)

mục nhập hộp thoại zenity với các tùy chọn

password=$(zenity --password)

zenity - mật khẩu

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

zenity --file-select

zenity --help

sự thoải mái - kết quả trợ giúp

zenity --help-general 

zenity - kết quả chung chung

zenity --help-entry

zenity - kết quả trợ giúp nhập cảnh

giao diện người dùng đồ họa khác (gui)

dialog

hộp thoại

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

dừng thực thi thêm tập lệnh tho, phá vỡ nó. dòng: echo $? , sẽ không bao giờ xảy ra

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.