¿Cómo creo una GUI basada en terminal?


50

Estoy buscando crear un entorno basado en terminal para adaptar mi script Bash . Quiero que se vea así:

Instalar Debian


44
Mira dialog, que es lo que parece usar.
DopeGhoti


Creo que una GUI basada en terminal es una TUI (que es diferente de la CLI).
UniversallyUniqueID

"tui" es un término RH IIRC. whiptail> dialogtambién
Bratchley

@Bratchley: GDB también lo utiliza tuipara su modo de ventana dividida (que muestra registros, fuente y comandos con, layout regpor ejemplo, y tui reg vecpara mostrar registros vectoriales en la ventana de registro (de una manera no flexible, por lo que esa parte no es realmente útil: /) . IDK si Redhat escribió el parche que agregó esa característica, o incluso qué edad tiene.
Peter Cordes

Respuestas:


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

ingrese la descripción de la imagen aquí

La respuesta del usuario se almacena en el código de salida, por lo que puede imprimirse como de costumbre: echo $?(tenga en cuenta que 0significa "sí" y 1es "no" en el mundo de shell).


Con respecto a otras preguntas de la sección de comentarios:

  • para poner en el cuadro de diálogo la salida de algún comando, simplemente use el mecanismo de sustitución de comandos $(), por ejemplo:

     dialog --backtitle "$(echo abc)" --title "$(cat file)" ...
    
  • para dar múltiples opciones al usuario, puede usar la --menuopción en lugar de--yesno

  • para almacenar la salida de la elección del usuario en la variable, uno necesita usar la --stdoutopción o cambiar el descriptor de salida, ya sea de forma --output-fdmanual o manual, por ejemplo:

    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"
    

    Este truco es necesario porque, dialogpor defecto, envía a stderr, no a stdout.

Y como siempre, man dialoges tu amigo.


eso es hermoso "Bla bla bla ..." pero ¿cómo se captura la salida?
tempforFind Me In The Woods

1
@tempforFindMeInTheWoods si por salida quiere decir código de salida, entonces, como de costumbre: se almacena dentro de la ?variable, intente echo $?.
jimmij

1
@tempforFindMeInTheWoods Si desea presentar la salida del comando parted -lal usuario a través del cuadro de diálogo, entonces probablemente la opción --menusea ​​una mejor opción en lugar de -yesno. En tal caso, tendría que jugar un poco con los descriptores para almacenar la salida en la variable, por ejemplo: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
O bien, puede usar la --stdoutopción.
Thomas Dickey

2
Todas las opciones de diálogo se explican en el manual:man dialog
Ferrybig

34

La captura de pantalla en la pregunta parece cola de látigo (un programa funcionalmente reducido que imita el diálogo , usando newt en lugar de ncurses ). La forma en que se representan el título y los botones está integrada en cada programa, lo que hace que se vean diferentes.

Aquí hay un script que duplica la captura de pantalla original, ya sea para whiptail o dialog:

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

y para comparación, captura de pantalla con whiptail:

captura de pantalla con whiptail

y con diálogo:

captura de pantalla con diálogo

Además de la apariencia diferente del título y los botones, el diálogo usa diferentes colores por defecto (aunque eso es configurable, ver capturas de pantalla ), y usa menos líneas en la pantalla.

dialog (y whiptail) usan bibliotecas para administrar la visualización de líneas, colores, etc. Pero también puede ver el tritón utilizado en el programa anaconda de Red Hat como una biblioteca compartida llamada desde python (con la misma apariencia). En la misma línea, el programa de configuración del kernel comenzó como una copia (cortada) del cuadro de diálogo, y luego evolucionó a características usando una biblioteca compartida (sin el lxdialogprograma original ) de forma muy similar a como se usa newt desde python.

Desde bash: puede usar el cuadro de diálogo o el whiptail para las funciones más utilizadas. Alguien escribió un contenedor para aquellos (en perl) para permitir que los scripts usen más fácilmente esos o algunos otros, pero es mejor usar el diálogo directamente ya que el módulo perl es esencialmente de denominador común.

Las fuentes de diálogo incluyen ejemplos de todos los widgets junto con la mayoría de las opciones de línea de comandos:

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.

Otras lecturas:


11

Creo que el paquete que estás buscando es ncurses .

Wikipedia describe ncurses de la siguiente manera:

ncurses (nuevas maldiciones) es una biblioteca de programación que proporciona una API que permite al programador escribir interfaces de usuario basadas en texto de manera independiente del terminal. Es un juego de herramientas para desarrollar software de aplicación "tipo GUI" que se ejecuta bajo un emulador de terminal

Es ampliamente utilizado, por ejemplo, en la herramienta de configuración del kernel menuconfig: Captura de pantalla de la herramienta de configuración de menú del kernel de Linux

Como está usando bash, puede usar Bash Simple Curses (como lo menciona Runium en el comentario a continuación).


11
ncurseses una biblioteca C. (Si entiendo correctamente) OP quiere un entorno de secuencias de comandos (para bash). menuconfigestá escrito en C. Como alternativa a dialog, según otra respuesta, quizás podrías mencionar Bash Simple Curses que está escrito en bash (confiando en tput).
Runium

@Runium: Gracias por la aclaración y el enlace a Bash Simple Curses.
Thawn

2
aun así, fue útil mencionar que ncurseses la base de esto, y responde a una versión más general de la pregunta ... como la del título aquí :)
underscore_d

-1

zenity

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)

entrada de diálogo zenity con opciones

password=$(zenity --password)

zenity --password

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

zenity - selección de archivos

zenity --help

zenity: resultado de ayuda

zenity --help-general 

zenity: resultado de ayuda general

zenity --help-entry

zenity - resultado de entrada de ayuda

otras interfaces gráficas de usuario (gui)

dialog

diálogo

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

detiene la ejecución posterior del script aunque lo rompe. la línea: echo $? , nunca ocurrirá

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.