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

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

当我执行脚本(通过双击)时,有没有办法获得用户确认(如您确定吗-是/否)类型的对话框?我不是指在终端中,而是指图形确认框,如下所示: 在此处输入图片描述

(我知道该图像来自 Windows,但我找不到 Linux 的)

答案1

有一种方法可以使用zenity

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

在此处输入图片描述

您可以使用$?变量测试该命令的退出状态,如下所示:if [ $? -eq 1 ];then exit 1 ; fi. 0is OK, 1is cancel。如果您稍后需要测试弹出窗口的退出状态,此构造将非常有效,也许$?在弹出窗口退出后立即将其存储到变量中。如评论中所述,像下面这样的结构也将有效:

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

您可以xmessage在脚本本身中使用。在“shebang”后面放置类似以下内容:

xmessage "Are you sure?"

这将显示一条图形消息,显示“你确定吗?”并带有一个“确定”按钮。

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

例如,

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

查看man xmessage所有选项(有很多)。

答案3

我不会告诉你该怎么做,而是会告诉你不应该这么做。

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

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

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

希望您不会认为从应用程序菜单中单击它是意外。因此,您的问题变成了如何让脚本出现在那里,而不是使用文件管理器。为此,您需要执行以下操作:

  1. 将脚本放置在远离其他文件的地方,以免用户意外点击它(典型的位置是/usr/local/bin/系统范围的安装或~/.local/bin/用户安装)

  2. 创建桌面条目文件(读取标准规格)。这是一个最小的例子:

    [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 确认对话框

当然,这种行为是可配置的,用户可以将其关闭(注意输入可执行文本文件)。

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

因此,不要在脚本中添加烦人的确认对话框。正确配置文件管理器。并让您的用户也这样做。

答案4

你可以使用 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 更具可配置性,因此更加实用。

相关内容