Como outros já disseram, isso ocorre porque o stdin
de sh
foi redirecionado para leitura do pipe, ele não está conectado ao terminal como normalmente seria. Uma coisa que você pode fazer para contornar isso é usar /dev/tty
para forçar o script a ler do terminal. Por exemplo:
#!/bin/sh
read -p "Are you sure [Y/n]?" line </dev/tty
case "$line" in
y|Y) echo "confirmed"
;;
*) echo "not confirmed"
;;
esac
Normalmente, você só faria isso se quisesse especificamente evitar que as pessoas criassem scripts na entrada, por exemplo:
echo Y | sh confirmation.sh
Isso ainda seria lido no terminal, embora o usuário possa esperar que ele insira automaticamente Y
no prompt. É comum que programas que esperam uma senha façam isso.