オプションで、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