Eu tenho um script que pode, opcionalmente, receber alguma entrada no STDIN e posteriormente apresentar ao usuário algumas listas de seleção. Quando os dados são inseridos no STDIN, a lista de seleção é apresentada, mas sai sem receber entrada, porém funciona bem quando nada é fornecido via stdin.
Eu tenho um exemplo simples:
#!/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
Executando sem stdin:
$ ./script.sh
1) foo
2) bar
3) baz
#? 2
You have selected bar
Executando com stdin:
$ printf '%s\n' foo bar | ./script.sh
foo
bar
1) foo
2) bar
3) baz
#?
$
Alguém sabe por que isso acontece e como evitá-lo?
Você "esgotou" todo o stdin no momento em que
select
é executado, então ele retorna com status 1 e nada selecionadoTalvez você quisesse forçar a interatividade lendo
/dev/tty
?