¿Cómo mostrar un cuadro de mensaje GUI de un script bash en Linux?


151

Estoy escribiendo algunos pequeños scripts de bash en Ubuntu Linux. Quiero poder ejecutarlos desde la GUI sin necesidad de una ventana de terminal para ingresar ninguna entrada o ver cualquier salida.

Hasta ahora, la única entrada requerida es una contraseña para sudo, y gksudo maneja eso bien. Pero todavía no he encontrado una manera fácil de mostrar un cuadro de mensaje. ¿Hay algún tipo de comando 'gkmessage' disponible? Prefiero algo presente en una instalación predeterminada de Ubuntu, pero no me importa instalar un nuevo paquete si es necesario.


Respuestas:


143

Creo que Zenity hará lo que quieras. Está específicamente diseñado para mostrar cuadros de diálogo GTK desde la línea de comandos, y está disponible como un paquete de Ubuntu .


44
zenity --helpNo es tan útil. Para que esto sea útil, debe asegurarse de configurarlo --text=My text herepara que muestre algo ...
Stephen

10
Por ejemplozenity --info --text="Calculation complete"
Craig McQueen el

3
@Stephen, por alguna extraña razón, el comando correcto es zenity --help-all.
GKFX

3
No me gustan los programas que necesitan abrir la pantalla para imprimir el mensaje de ayuda ...
thoni56

Utilizo este método para mostrar advertencias o errores .xinitrcal iniciar mi xorgservidor. De lo contrario, los errores serían transparentes. También prefiero este zenitysobre kdialogdesde KDE no se ha iniciado todavía y librerías GTK son más ligeros.
cmevoli

152

Si está utilizando Ubuntu muchas distribuciones, el notify-sendcomando arrojará una de esas agradables notificaciones perecederas en la esquina superior derecha. Al igual que:

notify-send "My name is bash and I rock da house"

¡Hermoso!


2
Esto también funciona con Fedora. Estoy bastante seguro de que cualquier distribución de Linux puede hacer esto.
kmatheny

44
No funciona en Raspbian GNU / Linux 7. ¿Hay algún paquete que deba instalarse?
carl verbiest

1
en los repositorios de debian: apt-cache search notify-osd @carlverbiest
santa

2
en Ubuntu 14.04 al menos, si la llamada se notifica-envía con tiempo de espera 0 como "notificar-enviar -t 0 '¡Hola!'", aparecerá un cuadro de diálogo emergente que no caduca.
vancan1ty

En Debian Jessie el libnotify-binpaquete contiene el notify-sendbinario. Parece que Gnome3 no requiere, notify-osdpero supongo que otros entornos de escritorio pueden requerir eso además delibnotify-bin
Jasen

78

Todos mencionan zenity, parece que hay muchos otros. Una lista confusa pero interesante está en http://alternativeto.net/software/zenity/

Primero, un ejemplo de zenity con marcado de formato de texto, título de ventana, etiqueta de botón.

zenity \
--info \
--text="<span size=\"xx-large\">Time is $(date +%Hh%M).</span>\n\nGet your <b>coffee</b>." \
--title="Coffee time" \
--ok-label="Sip"

gxmessage

gxmessage "my text"

xmessage

xmessagees muy antiguo, por lo que es estable y probablemente esté disponible en todas las distribuciones que usan X (ya que se distribuye con X). Es personalizable a través de recursos X, para aquellos que han estado usando Linux o Unix durante el tiempo suficiente para saber lo que significa ( .Xdefaults¿alguien?).

xmessage -buttons Ok:0,"Not sure":1,Cancel:2 -default Ok -nearmouse "Is xmessage enough for the job ?" -timeout 10

kdialog

(no probado)

En un PPA

YAD: Zenity On Steroids [Mostrar cuadros de diálogo gráficos desde scripts de Shell] ~ Web Upd8: blog Ubuntu / Linux . No parece que los diálogos de tamaño automático.

echo My text | yad \
--text-info \
--width=400 \
--height=200

Un gran ejemplo

yad \
--title="Desktop entry editor" \
--text="Simple desktop entry editor" \
--form \
--field="Type:CB" \
--field="Name" \
--field="Generic name" \
--field="Comment" \
--field="Command:FL" \
--field="Icon" \
--field="In terminal:CHK" \
--field="Startup notify:CHK" "Application" "Name" "Generic name" "This is the comment" "/usr/bin/yad" "yad" FALSE TRUE \
--button="WebUpd8:2" \
--button="gtk-ok:0" \
--button="gtk-cancel:1"

Otros no en repositorios estándar de Ubuntu

  • shellgui
  • xdialog
  • gtkdialog

Fuera de tema (para terminal)

whiptail --msgbox "my text" 10 20
dialog --msgbox "my text" 10 20

Siéntase libre de editar.



@ThorSummoner gracias por la sugerencia. Para el lector interesado, la diferencia es que whiptail --infobox(que no funciona correctamente en terminales que admiten pantallas alternativas) regresa sin esperar la entrada del usuario, mientras whiptail --msgboxque (que funciona) espera la confirmación del usuario antes de salir.
Stéphane Gourichon

Recuerdo que no estaba satisfecho con msgbox, para mis propósitos en ese momento, creo que necesitaba que la salida fuera visible en un registro o algo así;
ThorSummoner

¡Muchas opciones! Muy buenos ejemplos
artu-hnrq

49

La aplicación zenity parece ser lo que estás buscando.

Para recibir información de zenity , puede especificar una variable y tener la salida de zenity --entry guardada en ella. Se parece a esto:

my_variable=$(zenity --entry)

Si observa el valor en my_variable ahora, será lo que se haya escrito en el cuadro de diálogo de entrada emergente zenity.

Si desea dar algún tipo de aviso sobre lo que el usuario (o usted) debe ingresar en el cuadro de diálogo, agregue el modificador --text con la etiqueta que desee. Se parece a esto:

my_variable=$(zenity --entry --text="What's my variable:")

Zenity tiene muchas otras buenas opciones que son para tareas específicas, por lo que es posible que también desee comprobarlas con zenity --help . Un ejemplo es la opción --calendar que le permite seleccionar una fecha de un calendario gráfico.

my_date=$(zenity --calendar)

Lo que da una fecha bien formateada en función de lo que hizo clic el usuario:

echo ${my_date}

da:

05/08/2009

También hay opciones para selectores deslizantes, errores, listas, etc.

Espero que esto ayude.


Puedo ver que se zentityve genial. Sin embargo, no es parte de Ubuntu 12.04, así que fui con él gxmessage.
Peter V. Mørch


8

Aquí hay un pequeño script Tcl que hará lo que quieras. El intérprete Wish debe instalarse de manera predeterminada en Ubuntu.

#!/usr/bin/wish
pack [label .msg -text [lindex $argv 0]]
pack [entry .ent]
bind .ent <KeyPress-Return> { puts [.ent get]; destroy . }
focus .ent

Llámalo así:

myanswer=`gui-prompt "type your answer and press enter"`

7

alerty notify-sendparece ser lo mismo Lo uso notify-sendpara mensajes que no son de entrada, ya que no roba el foco y no puedo encontrar una manera de evitar que zenity, etc. haga esto.

p.ej

# This will display message and then disappear after a delay:
notify-send "job complete"

# This will display message and stay on-screen until clicked:
notify-send -u critical "job complete"

6

También hay dialogy la versión de KDE kdialog. dialoges utilizado por slackware, por lo que podría no estar disponible de inmediato en otras distribuciones.


6

Si nada más está presente. puedes lanzar un xterm y hacer eco en él, así:

 xterm -e bash -c 'echo "this is the message";echo;echo -n "press enter to continue "; stty sane -echo;answer=$( while ! head -c 1;do true ;done);'

3

¿Qué hay de la alerta de Ubuntu ? Se puede usar después de cualquier operación para alertarlo de que finalizó e incluso mostrar el icono de la cruz roja si la operación se completó con errores

ls -la; alert

3

Zenity es realmente la herramienta exacta que creo que estás buscando.

o

zenity --help

0

Kdialog y dialog son buenos, pero recomendaría Zenity. Rápido, fácil y mucho mejor mirando el mensaje o diálogo.


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.