更新-看起来这是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
因此,最终我编写了可以在脚本中使用的我自己的选择。
# $1 timeout
# rest - selection
function select_ {
t=$1
shift
arr=($*)
i=1
for a in $*; do
echo "$i) $a" >$(tty)
((i++))
done
echo "TIMEOUT: In ${t} seconds ${arr[0]} will be automatically selected." >$(tty)
printf "#? " >$(tty)
read -t $t x
[ "$x" == "" ] && {
x=1
echo "$x" >$(tty)
}
((x=x+0))
[ "$x" -ge 1 -a "$x" -le ${#arr[@]} ] && {
((x--))
echo ${arr[$x]}
}
}
如何使用它:
select_ 10 a b c
例子:
$ ./x.sh
1) a
2) b
3) c
TIMEOUT: In 10 seconds a will be automatically selected.
#? 2
b
$ ./x.sh
1) a
2) b
3) c
TIMEOUT: In 10 seconds a will be automatically selected.
#? 1
a
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句