bash超时后如何建立默认操作的菜单?
How to build a menu with a default operation after timeout in bash?
我在 bash 中遇到了一个小问题。我想要做的是:在启动我的 raspberry pi 时自动登录并启动一个脚本,我可以在其中选择(菜单,我使用对话框)启动哪个程序。但是,当 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.
对话框退出时需要查看退出代码。 (这将是 $?
的值,但您需要立即获取它,因为它会在每个命令后重置。)
您可能还想自定义 return 代码,这可以通过定义一些环境变量来实现。在下面的代码片段中,我将 DIALOG_ERROR
设置为 5,这将应用于超时(和其他随机错误),同时我将 DIALOG_ESC
设置为 1,这样它与选择“取消”按钮的效果相同.默认情况下,ESC 和超时实际上 return 相同的值(255,即使联机帮助页说 -1,因为进程退出代码只有八位并且通常是无符号的)。如果您希望 Escape 键快速 select 默认值,那么您也可以将 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
其他退出码,none适用于本例:
- 2 次帮助按钮已按下
- 3 按下额外的按钮
- 4 项请求帮助
详见man dialog
(搜索DIAGNOSTICS
。接近尾声。)
我在 bash 中遇到了一个小问题。我想要做的是:在启动我的 raspberry pi 时自动登录并启动一个脚本,我可以在其中选择(菜单,我使用对话框)启动哪个程序。但是,当 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.
对话框退出时需要查看退出代码。 (这将是 $?
的值,但您需要立即获取它,因为它会在每个命令后重置。)
您可能还想自定义 return 代码,这可以通过定义一些环境变量来实现。在下面的代码片段中,我将 DIALOG_ERROR
设置为 5,这将应用于超时(和其他随机错误),同时我将 DIALOG_ESC
设置为 1,这样它与选择“取消”按钮的效果相同.默认情况下,ESC 和超时实际上 return 相同的值(255,即使联机帮助页说 -1,因为进程退出代码只有八位并且通常是无符号的)。如果您希望 Escape 键快速 select 默认值,那么您也可以将 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
其他退出码,none适用于本例:
- 2 次帮助按钮已按下
- 3 按下额外的按钮
- 4 项请求帮助
详见man dialog
(搜索DIAGNOSTICS
。接近尾声。)