在执行脚本之前要求用户确认?


8

当我执行脚本(通过双击)时,是否有一种获取用户确认(如您确定/是/否)类型对话框的方法?我的意思不是在Terminal中,而是一个图形确认框,如下所示: 在此处输入图片说明

(我知道映像来自Windows,找不到Linux)

Answers:


13

有一种使用方法 zenity

zenity --question --text "Are you sure?"

在此处输入图片说明

您可以使用$?变量测试该命令的退出状态,如下所示:if [ $? -eq 1 ];then exit 1 ; fi0OK1被取消。如果您以后需要测试弹出窗口的退出状态,则可以很好地使用此构造,也许可以$?在弹出窗口退出到变量之后立即进行存储。如评论中所讨论的,波纹管之类的结构也将起作用:

if zenity --question --text "Are you sure" 
then
     runSumeFunction
else
     exit 1
 fi

要么

 zenity --question --text "Are you sure?" || echo "User isn't sure:/"

2
您不需要方括号。只要做if zenity...zenity... || exit
凯文

可以那样做,但是我更喜欢“传统”风格
Sergiy Kolodyazhnyy 2016年

2
对我来说,通过将程序的退出状态输入另一个程序(或内置的shell)然后测试该程序的退出状态来测试程序的退出状态似乎很愚蠢。
凯文

它有些愚蠢,但却成为一种习惯的力量
Sergiy Kolodyazhnyy

6

您可以xmessage在脚本本身中使用。在“ shebang”之后放这样的东西:

xmessage "Are you sure?"

这将显示图形消息“您确定吗?” 使用“确定”按钮。

您可以配置xmessage多个按钮,并更改其中的内容。您还可以配置每个按钮执行的操作。

例如,

xmessage -buttons ok:0,cancel:1 "Are you sure?"  

请参阅man xmessage所有选项(其中有很多)。


谢谢...这个解决方案也很好..只是zenity显示了一个更好看的对话框..就功能而言,两者都起作用...
mayank budhwani

5

除了告诉您如何操作外,我将告诉您您不应该这样做。

TL; DR-请勿更改脚本。而是配置您的文件管理器或弄清楚为什么用户意外运行它。

编辑:您似乎将您的脚本视为某种特殊,好像常规设置不够好,并且您的脚本需要用户的特殊确认。双击它确认。如果发现用户无意中运行了它,则必须弄清楚他们为什么这样做并解决该问题。那么,您真正的问题不是如何要求确认,而是如何防止用户意外运行它。

从暴露问题的方式看,您似乎希望通过导航到文件所在的位置,然后从文件管理器中单击它来运行程序(脚本)。考虑一下系统中的所有其他程序。你从几开始呢?/usr/local/bin启动Firefox时,您是否导航到?你当然不会。您从应用程序菜单上单击它。(gnome tweak是一个python脚本,也许是一个更好的例子)

希望您不会考虑从应用程序菜单中单击它而导致事故。因此,您的问题就变成了如何使脚本显示在此处而不是使用文件管理器。为此,您需要执行以下操作:

  1. 将脚本远离用户可能会意外单击的其他文件(典型的位置是/usr/local/bin/用于系统范围的安装或~/.local/bin/用户安装)

  2. 创建一个Desktop Entry文件(阅读标准规范)。这是一个最小的情况:

    [Desktop Entry]
    Name=Your script name
    Exec=path/for/your/script
    Icon=path/for/your/icon/can/be/svg
    Terminal=false
    Type=Application

    并将其推入/usr/local/share/applications/your-script.xml~/.local/share/your-script.xml

  3. 终于跑了update-desktop-database


由于您双击脚本,因此文件管理器的工作是确认这一点。确认脚本是否应该运行不是脚本的工作。将此发挥到极致。您能想象每次调用任何程序来确认它会多么荒谬吗?

程序要求进行确认的唯一时间是它即将执行可能危险且不可逆的操作时。例如,覆盖文件或绕过垃圾桶。请注意,即使是这些示例,都是关于使程序执行特定的操作。他们不是要启动这样的程序。如果程序的唯一目的是做这种危险的事情,那么它也不应该要求确认。

实际上,默认情况下,Nautilus(Gnome文件管理器)已经要求您确认是否要执行脚本(或只是在文本编辑器中打开它)。

鹦鹉螺确认对话框

当然,此行为是可配置的,从而使用户可以将其关闭(请注意“ 可执行文本文件”上的条目)。

Nautilus首选项菜单-行为选项卡

因此,请勿在脚本中添加烦人的确认对话框。正确配置文件管理器。并让您的用户做同样的事情。


1
这并不是真正的解决方案,因为无法轻松安全地与他人共享。
Ismael Miguel

谢谢...我知道该怎么做..但这为所有脚本添加了一个确认...我希望针对特定脚本...
mayank budhwani

@IsmaelMiguel,但这就是答案的重点。不应共享。有两种不同的东西,程序的动作和系统的行为/经验。您不应该合并两者。
carandraug '16

@IsmaelMiguel这个答案指出了用户想要做什么的反模式。它不会把鱼交给发烟人,因为他过敏。
Braiam '16

@mayankbudhwani,您仍在解决错误的问题。为什么该特定脚本特别?如果您的用户无意中单击它,那就是另一个问题。我用另一种方法编辑了答案。
carandraug '16

2

您可以使用yad,就像在类固醇上的zenity一样,因为它的可配置性要高得多。您可以从Ubuntu的软件中心进行安装。您可以输入最基本的形式

yad --title=Question --image=dialog-question --text="Are you sure?"

并且您应该看到以下内容: 屏幕截图1

如果按“确定”,则返回码为0;如果按“取消”,则返回码为1。

最好将框放在中间并调整其宽度,使用前导标签将文本“您确定吗?” 更右边,也总是放在最前面。为此,我们需要:

yad --center --on-top --title=Question --image=dialog-question --text="\tAre you sure?" --width 200

除了“您确定吗?”之前的“ \ t”之外,大多数开关都是不言自明的。只需在打印文本之前添加一个制表符空间。现在我们应该看到:在此处输入图片说明

盒子居中,总是在顶部,看起来更好。要设置变量以测试按下哪个按钮,请使用:

yad --center --on-top --title=Question --image=dialog-question --text="\tAre you sure?" --width 200;result=$?;echo $result

在此示例中,我们使用变量$ result,如果按下OK键,则将其设置为0;如果按下Cancel键,则将其设置为1。

对于yad的帮助,您可以使用man yad或,yad --help-all但是我发现实际示例更容易适应。有一些在这里。在我看来,yad比zenity更可配置,因此更有用。


万一它对我以前发布过一次使用yad的人有帮助。您可以在这里看到它:askubuntu.com/questions/488350/…–
Scooby-2,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.