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.


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 .


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!


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.



@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.


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


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"`

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"

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.


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);'

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

3

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

ou

zenity --help

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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.