170

我正在 Ubuntu linux 下编写一些小 bash 脚本。我希望能够从 GUI 运行它们,而无需终端窗口来输入任何输入或查看任何输出。

到目前为止,唯一需要的输入是 sudo 的密码 - 而 gksudo 处理得很好。但是我还没有找到一种简单的方法来显示消息框。是否有某种“gkmessage”命令可用?我更喜欢默认 Ubuntu 安装中存在的东西,但我不介意在必要时安装新包。

4

14 回答 14

172

如果您使用的是Ubuntu许多发行版,则该notify-send命令将在右上角抛出那些漂亮的易腐烂通知之一。像这样:

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

美丽的!

于 2013-01-20T06:58:38.433 回答
157

我相信Zenity会做你想做的事。它是专门为从命令行显示 GTK 对话框而设计的,它以Ubuntu 软件包的形式提供。

于 2008-08-10T06:40:47.603 回答
99

每个人都提到zenity,似乎还有很多其他的。一个混合但有趣的列表位于http://alternativeto.net/software/zenity/

首先,一个 Zenity 的例子,具有文本格式标记、窗口标题、按钮标签。

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非常古老,因此它很稳定,并且可能在所有使用 X 的发行版中都可用(因为它与 X 一起发行)。它可以通过 X 资源进行定制,对于那些已经使用 Linux 或 Unix 足够长的时间来了解它的含义的人(.Xdefaults任何人?)。

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

kdialog(KDE 工具)

kdialog --error "Some error occurred"

在 PPA 中

YAD:Zenity On Steroids [从 Shell 脚本显示图形对话框] ~ Web Upd8:Ubuntu / Linux 博客。似乎不会自动调整对话框大小。

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

一个更大的例子

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"

其他不在 Ubuntu 标准存储库中的

  • 壳贵
  • 对话
  • gtk对话框

题外话(终端)

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

随意编辑。

于 2014-01-28T14:48:46.917 回答
51

zenity应用程序似乎是您正在寻找的。

要从zenity获取输入,您可以指定一个变量并将zenity --entry的输出保存到其中。它看起来像这样:

my_variable=$(zenity --entry)

如果您现在查看 my_variable 中的值它将是在 zenity 弹出条目对话框中输入的任何内容。

如果您想就用户(或您)应在对话框中输入的内容给出某种提示,请添加带有所需标签的--text开关。它看起来像这样:

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

Zenity 有许多其他适用于特定任务的不错的选项,因此您可能还想使用zenity --help来查看这些选项。一个例子是--calendar选项,它让您从图形日历中选择一个日期。

my_date=$(zenity --calendar)

根据用户点击的内容,它给出了一个格式良好的日期:

echo ${my_date}

给出:

2009 年 8 月 5 日

还有滑块选择器、错误、列表等选项。

希望这可以帮助。

于 2009-08-05T18:49:22.233 回答
20

我找到了xmessage命令,这已经足够好了。

于 2008-08-10T04:26:16.863 回答
10

alert似乎notify-send是同一件事。我notify-send用于非输入消息,因为它不会窃取焦点,而且我找不到阻止 zenity 等这样做的方法。

例如

# 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"
于 2017-02-08T23:43:45.867 回答
9

如果没有其他东西存在。您可以启动一个 xterm 并在其中回显,如下所示:

 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);'
于 2017-11-09T03:44:31.433 回答
8

这是一个小 Tcl 脚本,它会做你想做的事。Wish 解释器应该默认安装在 Ubuntu 上。

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

像这样称呼它:

myanswer=`gui-prompt "type your answer and press enter"`
于 2008-08-10T04:34:36.627 回答
7

还有dialog和KDE版本kdialogdialog由 slackware 使用,因此它可能不会立即在其他发行版上可用。

于 2008-09-17T00:26:46.780 回答
4

Ubuntu的警报怎么样。它可以在任何操作完成后使用它来提醒它完成,如果操作完成错误,甚至会显示红色十字图标

ls -la; alert
于 2016-03-10T15:30:00.537 回答
3

Zenity确实是我认为您正在寻找的确切工具。

或者

zenity --help
于 2008-09-17T02:18:16.280 回答
2

您可以使用shellmarks在运行 shell 脚本之前显示一个 GUI 对话框,这将允许用户输入将放置在环境中的数据。

#!/bin/bash
echo "Hello ${name}"
exit 0
---
[name]
  type="text"
  label="Please enter your name"
  required=true

运行脚本:

shellmarks hello.sh

Shellmarks 对话框

如果在框中输入“Steve”并按运行,输出将是

Hello Steve

披露:我是 Shellmarks 的作者

于 2021-12-22T22:23:43.700 回答
0

Kdialog 和 dialog 都不错,但我推荐 Zenity。快速、简单、更好看的 xmessage 或对话框。

于 2008-09-17T02:13:53.420 回答
0

我喜欢我在script-dialog中看到的内容。它打勾了我所有的盒子,加上一些:

  • 弹出 GUI 框,但有文本模式回退
  • 支持各种 sudo 变体(gksudo、kde-sudo、...)
  • 可以在终端窗口中重新启动

事实上,它是 kdialog、zenity、dialog、whiptail 和自定义后备的包装器。

缺点是它没有 CLI,而是作为 bash 脚本的源代码。

于 2021-12-26T02:38:14.990 回答