如何在 linux 中显示来自 bash 脚本的 GUI 消息框?

Posted

技术标签:

【中文标题】如何在 linux 中显示来自 bash 脚本的 GUI 消息框?【英文标题】:How to show a GUI message box from a bash script in linux? 【发布时间】:2010-09-05 15:24:46 【问题描述】:

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

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

【问题讨论】:

相关:unix.stackexchange.com/questions/144924/… 【参考方案1】:

如果你使用 Ubuntu 很多发行版,notify-send 命令会在右上角抛出一个漂亮的易腐烂通知。像这样:

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

B.e.a.utiful!

【讨论】:

这也适用于 Fedora。我很确定任何 Linux 发行版都可以做到这一点。 不适用于 Raspbian GNU/Linux 7。是否有需要安装的软件包? 在 debian 存储库中:apt-cache search notify-osd @carlverbiest 至少在 Ubuntu 14.04 中,如果调用 notify-send 超时 0 像这样 "notify-send -t 0 'hi there!'" 你会得到一个不会过期的弹出对话框。跨度> 在 Debian Jessie 中,libnotify-bin 软件包包含 notify-send 二进制文件。 Gnome3 似乎不需要notify-osd,但我猜除了libnotify-bin之外,其他桌面环境可能还需要@【参考方案2】:

我相信Zenity 会做你想做的事。它专为从命令行显示 GTK 对话框而设计,可作为 Ubuntu package 使用。

【讨论】:

zenity --help 没那么有用。为了使它有用,您需要确保设置 --text=My text here 以使其显示某些内容... 例如zenity --info --text="Calculation complete" @Stephen,出于某种奇怪的原因,正确的命令是zenity --help-all 我不喜欢需要打开显示屏才能打印帮助信息的程序... 我使用此方法在我的.xinitrc 中显示警告或错误,同时启动我的xorg 服务器。否则错误将是透明的。我也更喜欢 zenity 而不是 kdialog,因为 KDE 还没有启动,而 GTK 库更轻量级。【参考方案3】:

每个人都提到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 [Display Graphical Dialogs From Shell Scripts] ~ Web Upd8: Ubuntu / Linux blog。似乎不会自动调整对话框大小。

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 标准存储库中

shellgui xdialog gtkdialog

题外话(针对终端)

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

随意编辑。

【讨论】:

注意,whiptail's --infobox has a long standing display bug with xterm (gnome-terminal) @ThorSummoner 感谢您的提示。对于感兴趣的读者,不同之处在于whiptail --infobox(在支持备用屏幕的终端上无法正常工作)无需等待用户输入即可返回,而whiptail --msgbox(有效)在退出前等待用户确认。 我记得对 msgbox 不满意,出于我当时的目的,我认为我需要在日志或类似的东西中查看输出; 很多选择!很好的例子【参考方案4】:

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

给予:

08/05/2009

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

希望这会有所帮助。

【讨论】:

我可以看到zentity 看起来很酷。但是它不是 Ubuntu 12.04 的一部分,所以我选择了 gxmessage【参考方案5】:

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

【讨论】:

这是他们所有人的祖父。【参考方案6】:

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

【讨论】:

【参考方案7】:

如果没有其他内容。您可以启动一个 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);'

【讨论】:

【参考方案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"`

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

ls -la; alert

【讨论】:

【参考方案11】:

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

zenity --help

【讨论】:

【参考方案12】:

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

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

运行脚本:

shellmarks hello.sh

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

Hello Steve

披露:我是 Shellmarks 的作者

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

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

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

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

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

【讨论】:

以上是关于如何在 linux 中显示来自 bash 脚本的 GUI 消息框?的主要内容,如果未能解决你的问题,请参考以下文章

图展 - 显示Linux, MacOS, Unix系统信息的bash脚本

Bash 脚本日志文件连续显示到屏幕上

如何在 Linux 中使用终端命令将文件参数传递给我的 bash 脚本? [复制]

如何在Linux 系统上比较Bash 脚本中的字符串?

Linux教程 - Bash脚本初学者完整指南

Linux基础7-4 Bash脚本编程练习2