Como mostrar uma caixa de mensagem da GUI a partir de um script bash no linux?

151

Estou escrevendo alguns pequenos scripts bash no Ubuntu linux. Quero poder executá-los a partir da GUI sem precisar de uma janela de terminal para inserir qualquer entrada ou exibir qualquer saída.

Até agora, a única entrada necessária é uma senha para o sudo - e o gksudo lida com isso. Mas ainda não encontrei uma maneira fácil de mostrar uma caixa de mensagem. Existe algum tipo de comando 'gkmessage' disponível? Prefiro algo presente em uma instalação padrão do Ubuntu, mas não me importo de instalar um novo pacote, se necessário.

Blorgbeard está fora
fonte
Relacionado: unix.stackexchange.com/questions/144924/…
Ciro Santilli

Respostas:

143

Eu acredito que o Zenity fará o que você quiser. Ele foi projetado especificamente para exibir caixas de diálogo GTK na linha de comando e está disponível como um pacote Ubuntu .

Derek Park
fonte
4
zenity --helpnão é tão útil. Para tornar isso útil, você precisa garantir que você definir --text=My text herepara torná-lo exibir alguma coisa ...
Stephen
10
Exemplozenity --info --text="Calculation complete"
Craig McQueen
3
@ Stephen, por algum motivo estranho, o comando correto é zenity --help-all.
GKFX 9/09/14
3
Eu não gosto de programas que precisa para abrir a tela, a fim de imprimir a mensagem de ajuda ...
thoni56
Eu uso esse método para exibir avisos ou erros dentro do .xinitrcmeu xorgservidor. Caso contrário, os erros seriam transparentes. Eu também prefiro este zenityao longo kdialogdesde o KDE não começou ainda e libs GTK são mais leves.
Cmevoli
152

Se você estiver usando muitas distros do Ubuntu, o notify-sendcomando lançará uma dessas boas notificações perecíveis no canto superior direito. Igual a:

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

Lindo!

chmac
fonte
2
Isso funciona com o Fedora também. Tenho certeza de que qualquer distribuição Linux pode fazer isso.
kmatheny
4
Não funciona no Raspbian GNU / Linux 7. Existe um pacote que precise ser instalado?
carl verbiest
1
nos repositórios do Debian: apt-cache search notificar-osd @carlverbiest
Santa
2
no Ubuntu 14.04, pelo menos, se a chamada notify-send com timeout 0 for igual a "notify-send -t 0 'oi!'", você receberá uma caixa de diálogo pop-up que não expira.
vancan1ty
No Debian Jessie, o libnotify-binpacote contém o notify-sendbinário. Não Gnome3 não parecem exigir notify-osdmas acho que outros ambientes de trabalho pode exigir que, além delibnotify-bin
Jasen
78

Todo mundo menciona zenidade, parece haver muitos outros. Uma lista confusa, mas interessante, está em http://alternativeto.net/software/zenity/

Primeiro, um exemplo de zenity com marcação de formatação de texto, título da janela, rótulo do botão.

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é muito antigo, portanto é estável e provavelmente está disponível em todas as distribuições que usam X (uma vez que é distribuído com X). É personalizável através dos recursos do X, para aqueles que usam o Linux ou Unix há tempo suficiente para saber o que isso significa ( .Xdefaults, alguém?).

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

kdialog

(não testado)

Em um PPA

YAD: Zenity on Steroids [Exibir caixas de diálogo gráficas de scripts de shell] ~ Web Upd8: Blog do Ubuntu / Linux . Não parece dimensionar automaticamente as caixas de diálogo.

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

Um exemplo maior

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"

Outros que não estão nos repositórios padrão do Ubuntu

  • shellgui
  • xdialog
  • gtkdialog

Fora do tópico (para terminal)

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

Sinta-se livre para editar.

Stéphane Gourichon
fonte
@ThorSummoner obrigado pela dica. Para o leitor interessado, a diferença é que whiptail --infobox(que não funciona corretamente em terminais que suportam tela alternativa) retorna sem aguardar a entrada do usuário, enquanto whiptail --msgbox(que funciona) aguarda confirmação do usuário antes de sair.
Stéphane Gourichon
Lembro-me de estar insatisfeito com o msgbox; para meus propósitos na época, acho que precisava que a saída fosse visível em um log ou algo assim;
ThorSummoner
Muitas opções! Exemplos bastante agradáveis
artu-hnrq 24/02
49

O aplicativo zenity parece ser o que você está procurando.

Para obter informações do zenity , você pode especificar uma variável e salvar a saída do zenity --entry . Parece algo assim:

my_variable=$(zenity --entry)

Se você observar o valor em my_variable agora, será o que foi digitado na caixa de diálogo de entrada pop-up do zenity.

Se você deseja fornecer algum tipo de prompt sobre o que o usuário (ou você) deve digitar na caixa de diálogo, adicione a opção --text com o rótulo que deseja. Parece algo assim:

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

O Zenity tem muitas outras opções legais para tarefas específicas, então você pode conferir isso também com o zenity --help . Um exemplo é a opção --calendar, que permite selecionar uma data em um calendário gráfico.

my_date=$(zenity --calendar)

O que fornece uma data bem formatada com base no que o usuário clicou:

echo ${my_date}

dá:

08/05/2009

Também existem opções para seletores, erros, listas e assim por diante.

Espero que isto ajude.

Jim
fonte
Eu posso ver zentityparece legal. No entanto, ele não faz parte do Ubuntu 12.04, então fui com gxmessageele.
Peter V. Mørch
19

Encontrei o comando xmessage , que é bom o suficiente.

Blorgbeard está fora
fonte
2
Esse é o avô de todos eles.
Ciro Santilli #
8

Aqui está um pequeno script Tcl que fará o que você deseja. O intérprete do Wish deve ser instalado por padrão no Ubuntu.

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

Chame assim:

myanswer=`gui-prompt "type your answer and press enter"`
Mark Harrison
fonte
7

alerte notify-sendparece ser a mesma coisa. eu usonotify-send para mensagens que não são de entrada, pois não roubam o foco e não consigo encontrar uma maneira de impedir o zenity etc.

por exemplo

# 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"
Dave Thebuskeruk
fonte
6

Existe também dialoga versão do KDE kdialog. dialogé usado pelo slackware, portanto, pode não estar disponível imediatamente em outras distribuições.

Steve Baker
fonte
5

se nada mais estiver presente. você pode iniciar um xterm e eco nele, assim:

 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);'
user6795571
fonte
3

E o alerta do Ubuntu . Ele pode ser usado após qualquer operação para alertá-lo como concluído e até mostrar o ícone da cruz vermelha se a operação foi finalizada com erros

ls -la; alert
mulya
fonte
3

O Zenity é realmente a ferramenta exata que eu acho que você está procurando.

ou

zenity --help
Lnux
fonte
0

Kdialog e dialog são bons, mas eu recomendaria o Zenity. Rápido, fácil e muito melhor visualizando o xmessage ou o diálogo.

Jarek
fonte
0

Exemplo de script bash para usar os controles Gambas GTK / QT (objetos da GUI): O Gambas IDE pode ser usado para projetar até mesmo grandes GUIs e atuar como um servidor da GUI. Exemplos de explicações podem ser baixados na App Store Gambas.
https://gambas.one/gambasfarm/?id=823&action=search

insira a descrição da imagem aqui

Peter Bauer
fonte