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

関連情報