更新- 看起来这是 bash 4.3.42 的特殊之处,因为它适用于 4.3.46。为那些将来遇到同样问题的人留下这篇文章。
当我在 bash 命令行中运行此命令时,它可以正常工作:
% (TMOUT=3; s="no selection"; select s in a b c ; do break ; done; echo $s)
1) a
2) b
3) c
#?
no selection
% _
结果:不显示任何选择并返回命令行。
但是,当我将它放置一个脚本并执行它时,它会反复请求选择。
% cat a.sh
#!/bin/bash
(TMOUT=3; s="no selection"; select s in a b c ; do break ; done; echo $s)
% ./a.sh
结果:
1) a
2) b
3) c
#? 1) a
2) b
3) c
#? 1) a
2) b
3) c
#? ^C
% _
为什么会这样?我的主要问题是 -如何让它在脚本中工作?!
更新
% bash --version
GNU bash, version 4.3.42(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
% uname
Linux lx1 2.6.32-642.6.2.el6.x86_64 #1 SMP Mon Oct 24 10:22:33 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux
从手册:
所以第一种情况是由于交互式外壳。
现在有脚本
使用
timeout
命令。这个例子可以改进,但它说明了这一点。首先使用 bash-builtintrap
命令在退出时运行一些东西,然后运行你的循环。它运行如下:所以最终我写了我自己的选择,可以在脚本中使用。
如何使用它:
例子: