我有一个脚本,可以选择在 STDIN 上获取一些输入,然后向用户提供一些选择列表。当在 STDIN 上输入数据时,选择列表会显示但退出而不接受输入,但是当通过 stdin 未提供任何内容时它可以正常工作。
我有一个简单的例子:
#!/usr/bin/env bash
if [[ -p /dev/stdin && ${#bar[@]} -eq 0 ]]; then
while IFS= read -r foo; do
bar+=("$foo")
done </dev/stdin
fi
for foo in "${bar[@]}"; do
echo "$foo"
done
select thing in foo bar baz; do
case $thing in
*) echo "You have selected $thing"; break;;
esac
done
不使用标准输入执行:
$ ./script.sh
1) foo
2) bar
3) baz
#? 2
You have selected bar
使用标准输入执行:
$ printf '%s\n' foo bar | ./script.sh
foo
bar
1) foo
2) bar
3) baz
#?
$
有谁知道为什么会发生这种情况以及如何预防?
在执行时你已经“用完了”所有的标准输入
select
,所以它返回状态为 1 并且没有选择任何内容也许您想通过阅读来强制交互
/dev/tty
?