bash - 如何在bash中建立超时后默认操作的菜单?

标签 bash menu dialog timeout

我在 bash 中遇到了一个小问题。我想做的是:当启动我的树莓派时自动登录并启动一个脚本,我可以在其中选择(像菜单,我使用对话框)启动哪个程序。但是,当 10 秒内没有选择选项时,将执行默认操作(第一个选项)。

嗯,第一部分有效。但我无法包含计时器或超时。超时选项本身只是在 10 秒后终止脚本,但不运行任何程序。

这是我到目前为止所拥有的( echo 用于测试目的):

#!/bin/sh

sw=`dialog --menu "choose a program" 20 73 8 "1) program 1" "this will start program 1" "2) program 2" "this will start program 2" 3>&1 1>&2 2>&3`

case "$sw" in
   "1) program 1")
      echo "program 1 is running" ;;
   "2) program 2")
      echo "program 2 is running" ;;
esac

我知道,这并不多。主要是因为我所有的尝试都导致了一个死胡同(据我所知 - 我尝试使用 sleep 命令来构建 while 和 for 循环)。

不幸的是,搜索网络没有帮助(再次:根据我的理解),所以你们有想法(或解决方案)如何解决这个问题吗?我刚刚开始学习 bash。

最佳答案

对话框退出时您需要查看退出代码。 (这将是 $? 的值,但您需要立即获取它,因为它会在每个命令后重置。)

您可能还想自定义返回代码,这可以通过定义一些环境变量来实现。在下面的代码片段中,我将 DIALOG_ERROR 设置为 5,这将适用于超时(和其他随机错误),而我将 DIALOG_ESC 设置为 1,以便它将成为与选择“取消”按钮相同。默认情况下,ESC 和超时实际上返回相同的值(255,即使联机帮助页显示 -1,因为进程退出代码只有 8 位并且通常是无符号的)。如果您希望 Escape 键快速选择默认值,那么您也可以将 DIALOG_ESC 设置为 5。

sw=`DIALOG_ERROR=5 DIALOG_ESC=1 dialog --timeout 10 \
           --menu "choose a program" 20 73 8 \
           "1) program 1" "this will start program 1" \
           "2) program 2" "this will start program 2" \
    3>&1 1>&2 2>&3`
rc=$?
case $rc in
   0) case "$sw" in
        "1) program 1")
            echo "program 1 is running" ;;
        "2) program 2")
            echo "program 2 is running" ;;
      esac;;
   1) echo You hit Cancel, doing nothing;;
   5) echo Running default program;;
   *) echo Unhandled exit code $rc;;;
esac

其他退出代码,均不适用于本示例:

  • 2 帮助按钮已按下
  • 按下了 3 个额外按钮
  • 请求 4 项帮助

有关详细信息,请参阅 man 对话框(搜索DIAGNOSTICS。已经接近尾声了。)

关于bash - 如何在bash中建立超时后默认操作的菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28777206/

相关文章:

linux - 命令在命令行工作但不在脚本中

python - 单击模块自动完成功能在 3 组深度下不起作用

wpf - WPF 应用程序中的菜单/工具栏颜色

android - Facebook session 取消对话框

validation - 在 p :dialog on validation failure 中自动显示验证消息

html - Electron 中的自定义 HTML 对话框

linux - 程序运行后的 UNIX 清除命令

linux - 将文本文件中的 block 写入多个新文件

css - 自定义 CSS 菜单, "Active"选项卡保留在 'Home' 而不是实际页面上

jquery - 将菜单保持在固定位置