STDIN 破坏了我的选择列表

STDIN 破坏了我的选择列表

我有一个脚本,可以选择在 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
#?
$

有谁知道为什么会发生这种情况以及如何预防?

答案1

你已经“用尽”了所有标准输入select执行时,它返回状态 1 并且没有选择任何内容

也许您想通过阅读来强制交互/dev/tty

#!/usr/bin/env bash
if [ ! -t 0 ]; then
    while IFS= read -r foo; do
        bar+=("$foo")
    done
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 </dev/tty

相关内容