Come mostrare una finestra di messaggio della GUI da uno script bash in Linux?


152

Sto scrivendo alcuni piccoli script bash su Ubuntu Linux. Voglio essere in grado di eseguirli dalla GUI senza la necessità di una finestra terminale per inserire qualsiasi input o visualizzare qualsiasi output.

Finora l'unico input richiesto è una password per sudo - e gksudo gestisce così bene. Ma non ho ancora trovato un modo semplice per mostrare una finestra di messaggio. È disponibile una sorta di comando 'gkmessage'? Preferirei qualcosa di presente in un'installazione predefinita di Ubuntu, ma non mi dispiace installare un nuovo pacchetto, se necessario.


Risposte:


143

Credo che lo Zenity farà ciò che vuoi. È progettato specificamente per visualizzare le finestre di dialogo GTK dalla riga di comando ed è disponibile come pacchetto Ubuntu .


4
zenity --helpnon è così utile. Per renderlo utile, devi assicurarti di impostare --text=My text hereper farlo visualizzare qualcosa ...
Stephen

10
Ad esempiozenity --info --text="Calculation complete"
Craig McQueen il

3
@Stephen, per qualche strana ragione è il comando corretto zenity --help-all.
GKFX,

3
Non mi piacciono i programmi che devono aprire il display per stampare il messaggio di aiuto ...
thoni56

Uso questo metodo per visualizzare avvisi o errori .xinitrcdurante l'avvio del xorgserver. Altrimenti gli errori sarebbero trasparenti. Anch'io preferisco questo zenitycorso kdialogin quanto KDE non è stato avviato ancora e librerie GTK sono più leggeri.
cmevoli

153

Se stai usando Ubuntu molte distro il notify-sendcomando lancerà una di quelle belle notifiche deperibili nell'angolo in alto a destra. Così:

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

Bellissimo!


2
Funziona anche con Fedora. Sono abbastanza certo che qualsiasi distribuzione Linux può fare questo.
kmatheny,

4
Non funziona su Raspbian GNU / Linux 7. Esiste un pacchetto che deve essere installato?
Carl verbiest,

1
nei repository debian: apt-cache search notify-osd @carlverbiest
santa

2
almeno in Ubuntu 14.04, se chiama notification-send con timeout 0 come in questo caso "notification-send -t 0 'ciao!'" otterrai una finestra di dialogo popup che non scade.
vancan1ty

In Debian Jessie il libnotify-binpacchetto contiene il notify-sendbinario. Sembra che Gnome3 non richieda, notify-osdma immagino che altri ambienti desktop potrebbero richiederlo oltre alibnotify-bin
Jasen,

78

Tutti parlano di zenità, sembra che ce ne siano molti altri. Un elenco confuso ma interessante è disponibile all'indirizzo http://alternativeto.net/software/zenity/

Innanzitutto, un esempio di zenity con markup di formattazione del testo, titolo della finestra, etichetta del pulsante.

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

xmessageè molto vecchio, quindi è stabile e probabilmente disponibile in tutte le distribuzioni che usano X (poiché è distribuito con X). È personalizzabile tramite risorse X, per coloro che usano Linux o Unix da abbastanza tempo per sapere cosa significa ( .Xdefaultschiunque?).

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

kdialog

(non testato)

In un PPA

YAD: Zenity on Steroids [Visualizza finestre di dialogo grafiche da script Shell] ~ Web Upd8: blog Ubuntu / Linux . Non sembra che le finestre di dialogo vengano ridimensionate automaticamente.

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

Un esempio più grande

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"

Altri non nei repository standard di Ubuntu

  • shellgui
  • Xdialog
  • GtkDialog

Fuori tema (per terminale)

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

Sentiti libero di modificare.



@ThorSummoner grazie per il suggerimento. Per il lettore interessato, la differenza è che whiptail --infobox(che non funziona correttamente sui terminali che supportano lo schermo alternativo) ritorna senza attendere l'input dell'utente, mentre whiptail --msgbox(che funziona) attende la conferma dell'utente prima di uscire.
Stéphane Gourichon,

Ricordo di essere insoddisfatto di msgbox, per i miei scopi in quel momento, penso di aver bisogno che l'output fosse visualizzabile in un registro o qualcosa del genere;
ThorSummoner,

Molte opzioni! Esempi piuttosto carini
artu-hnrq

49

L' applicazione zenity sembra essere ciò che stai cercando.

Per ottenere input da Zenity , è possibile specificare una variabile e salvare l'output di Zenity --entry . Sembra qualcosa del genere:

my_variable=$(zenity --entry)

Se guardi il valore in my_variable ora, sarà qualsiasi cosa sia stata digitata nella finestra di dialogo di pop-up di zenity.

Se vuoi dare una sorta di prompt su ciò che l'utente (o tu) dovresti inserire nella finestra di dialogo, aggiungi l' opzione --text con l'etichetta che desideri. Sembra qualcosa del genere:

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

Zenity ha molte altre belle opzioni che sono per compiti specifici, quindi potresti voler controllare anche quelle con zenity --help . Un esempio è l' opzione --calendar che consente di selezionare una data da un calendario grafico.

my_date=$(zenity --calendar)

Che dà una data ben formattata in base a ciò su cui l'utente ha fatto clic:

echo ${my_date}

dà:

08/05/2009

Ci sono anche opzioni per selettori di scorrimento, errori, elenchi e così via.

Spero che questo ti aiuti.


Vedo che zentitysembra bello. Tuttavia non fa parte di Ubuntu 12.04, quindi sono andato con gxmessage.
Peter V. Mørch,


8

Ecco un piccolo script Tcl che farà quello che vuoi. L'interprete Wish dovrebbe essere installato di default su Ubuntu.

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

Chiamalo così:

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

8

alerte notify-sendsembrano essere la stessa cosa. Uso notify-sendi messaggi non di input in quanto non rubano lo stato attivo e non riesco a trovare un modo per impedire a Zenity ecc. Di farlo.

per esempio

# 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

C'è anche dialoge la versione di KDE kdialog. dialogviene utilizzato da slackware, quindi potrebbe non essere immediatamente disponibile su altre distribuzioni.


6

se non è presente nient'altro. puoi lanciare un xterm ed eco in esso, in questo modo:

 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

Che ne dite di Ubuntu avviso . Può essere utilizzato dopo qualsiasi operazione per avvisare che è finito e persino mostrare l'icona della croce rossa se l'operazione è stata completata con errori

ls -la; alert

3

Lo Zenity è davvero lo strumento esatto che penso tu stia cercando.

o

zenity --help

0

Kdialog e dialoghi sono entrambi buoni, ma consiglierei Zenity. Veloce, facile e molto più bello nel messaggio o nella finestra di dialogo.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.