it-swarm.com.de

Wie erstelle ich eine terminalbasierte Benutzeroberfläche?

Ich möchte eine terminalbasierte Umgebung erstellen, in die ich mein Skript Bash anpassen kann. Ich möchte, dass es so aussieht:

(Debian install

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

(enter image description here

Die Benutzerantwort wird im Exit-Code gespeichert und kann wie gewohnt gedruckt werden: echo $? (Beachten Sie, dass 0 "Ja" bedeutet und 1 "Nein" im Shell Welt).


Zu anderen Fragen aus dem Kommentarbereich:

  • um die Ausgabe eines Befehls in das Dialogfeld einzufügen, verwenden Sie einfach den Befehlsersetzungsmechanismus $(), z.

     dialog --backtitle "$(echo abc)" --title "$(cat file)" ...
    
  • um dem Benutzer mehrere Auswahlmöglichkeiten zu bieten, können Sie die Option --menu anstelle von --yesno verwenden.

  • um die Ausgabe der Benutzerauswahl in einer Variablen zu speichern, muss die Option --stdout verwendet oder der Ausgabedeskriptor entweder über --output-fd oder manuell geändert werden, z.

    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"
    

    Dieser Trick wird benötigt, weil dialog standardmäßig an stderr und nicht an stdout ausgegeben wird.

Und wie immer ist man dialog Dein Freund.

45
jimmij

Der Screenshot in der Frage sieht aus wie Whiptail (ein funktional reduziertes Programm, das dialog imitiert und Newt anstelle von ncurses verwendet). Die Art und Weise, wie Titel und Schaltflächen gerendert werden, ist in jedes Programm integriert, sodass sie anders aussehen.

Hier ist ein Skript, das den ursprünglichen Screenshot für Whiptail oder Dialog dupliziert:

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

und zum Vergleich Screenshot mit Peitschenschwanz:

(screenshot with whiptail

und mit Dialog:

(screenshot with dialog

Neben dem unterschiedlichen Erscheinungsbild von Titel und Schaltflächen werden im Dialogfeld standardmäßig unterschiedliche Farben verwendet (obwohl dies konfigurierbar ist -- siehe Screenshots ) und es werden weniger Zeilen auf dem Bildschirm verwendet.

dialog (und whiptail) verwenden Bibliotheken zum Verwalten der Anzeige von Linien, Farben usw. Sie können jedoch auch Newt sehen, das im Red Hat anaconda-Programm als gemeinsam genutzte Bibliothek verwendet wird, die von python aufgerufen wird (mit derselben Aussehen). In diesem Sinne wurde das Kernel-Konfigurationsprogramm als (abgeschnittene) Kopie des Dialogfelds gestartet und dann mithilfe einer gemeinsam genutzten Bibliothek (ohne das ursprüngliche Programm lxdialog) zu Funktionen entwickelt, ähnlich wie bei newt Python.

Von Bash - Sie können entweder Dialog oder Whiptail für die am häufigsten verwendeten Funktionen verwenden. Jemand hat einen Wrapper für diese (in Perl) geschrieben, damit Skripte entweder diese oder einige andere leichter verwenden können, aber Sie sollten den Dialog besser direkt verwenden, da das Perl-Modul im Wesentlichen einen gemeinsamen Nenner hat.

Die Dialogquellen enthalten Beispiele für alle Widgets sowie die meisten Befehlszeilenoptionen:

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.

Weiterführende Literatur:

33
Thomas Dickey

Ich glaube, das Paket, das Sie suchen, ist ncurses .

Wikipedia beschreibt Flüche wie folgt:

ncurses (new curses) ist eine Programmierbibliothek, die eine API bereitstellt, mit der der Programmierer textbasierte Benutzeroberflächen terminalunabhängig schreiben kann. Es ist ein Toolkit zur Entwicklung einer "GUI-ähnlichen" Anwendungssoftware, die unter einem Terminalemulator ausgeführt wird

Es wird beispielsweise im Kernel-Konfigurationstool menuconfig häufig verwendet: Screen shot of Linux kernel menuconfig tool

Da Sie bash verwenden, können Sie Bash Simple Curses verwenden (wie von Runium im Kommentar unten erwähnt).

12
Thawn

Zenität

zenity --file-selection --directory

.

# var means variable

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

zenity dialog entry with options

password=$(zenity --password)

zenity --password

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

zenity --file-selection

# ls is a command to list files in a directory

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

# Hilfe

zenity --help

zenity --help result

zenity --help-general 

zenity --help-general result

zenity --help-entry

zenity --help-entry result

andere grafische Benutzeroberflächen (GUI)

dialog

dialog

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

stoppt die weitere Ausführung des Skripts und bricht es ab. der Befehl echo $? , Wird nie passieren

0
FireInTheSky