make bash脚本显示系统事件对话框,然后获取其结果并在if语句中使用它

时间:2015-05-26 07:54:16

标签: macos bash shell applescript

我在macOS上。我有一个脚本,在使用终端中的read请求确认后,使用grep检查是否已挂载/ dev / disk1,然后格式化该磁盘。这是一个危险的剧本,因此,首先要问它是否合适是至关重要的。

最后,我想让这个脚本成为用户可以双击的可执行文件。但是,不是让用户键入“y”并返回到终端窗口,我宁愿显示“是”和“否”按钮的显示对话框,让他们选择,然后根据他们的答案运行脚本。在bash中这可能吗?

我在一个我没有管理访问权限的环境中工作,所以虽然我可以编写AppleScript服务来完成我想要做的事情并将其优雅地集成到用户界面中,但我无法集成没有管理员密码的服务进入环境(因为我无法为没有它的用​​户编辑〜/ Library / Services)。此外,我无法下载或安装任何新的库,应用程序 - 任何,真的 - 在环境中;我必须只在Mac OS X中使用原生bash。

这就是我所拥有的:

read -p "Are you sure you want to partition this disk? " -n 1 -r # Can I make this be a dialog box instead?
echo 

if [[ $REPLY =~ ^[Yy]$ ]] # Can this accept the result as a condition?
then
    if grep -q 'disk1' /dev/ && grep -q 'file.bin' ~/Downloads; then
        echo # redacted actual code
    else
        osascript -e 'tell app "System Events" to display dialog "The disk is not mounted."'
        exit 1
    fi
else
    exit 1
fi

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:9)

是的,在bash中可以获取osascript对话框的输出。这是一个带有是/否对话框的示例:

#!/bin/bash

SURETY="$(osascript -e 'display dialog "Are you sure you want to partition this disk?" buttons {"Yes", "No"} default button "No"')"

if [ "$SURETY" = "button returned:Yes" ]; then
    echo "Yes, continue with partition."
else
    echo "No, cancel partition."
fi

如果您运行此脚本,脚本应根据按下的按钮回显相应的行。

它还显示了如何设置默认按钮,我假设示例为“否”。

如果你有一个更复杂的对话框,你很可能会使用正则表达式来检测响应,就像在你自己的样本中一样;虽然根据您的使用情况,您可能希望防止欺骗性响应。

答案 1 :(得分:2)

如果您对文本模式(但跨平台且经过验证)的解决方案感到满意,请尝试使用ncurses,特别是名为dialog的实用程序。

dialog --yesno "Are you sure you want to partition this disk?" 5 50
answer=$?       # Returns: 0 == yes, 1 == no

this tutorial中的更多详情。