Você precisa ter uma GUI ou um terminal para entrada do usuário. Se o usuário abrir o script, digamos Nautilus, não há stdin, então a leitura retornará imediatamente. Uma solução possível seria fazer com que o script abrisse um novo terminal e se executasse nele assim:
x-terminal-emulator -e $0
Com o emulador de terminal x, o emulador de terminal padrão é chamado. Isso funciona com o Debian e Ubuntu, não conheço outras distros. Você pode ligar para um terminal específico como xterm, konsole ou qualquer outro terminal, é claro.
$0
é o caminho do arquivo do script, portanto, isso sempre funciona.
Você também precisa garantir que ele não abra recursivamente mais terminais. Uma maneira de isso funcionar é verificar se você pode ler do stdin, como já faz:
O código de retorno do comando read é zero, a menos que seja encontrado um caractere de fim de arquivo, se o tempo limite da leitura for excedido ou se um descritor de arquivo inválido for fornecido como argumento para a opção -u.
Portanto, verifique o valor de retorno, se for! = 0, abra o novo terminal como acima, caso contrário não.
Exemplo:
#!/bin/bash
read -p "Enter first value: " first
# Check return value of last command with $?
if [[ $? != 0 ]]; then
x-terminal-emulator -e $0
else
echo $first
read -p "Enter more: " more
echo $more
fi
Veja esta pergunta se você precisar manter o terminal aberto após o término do programa.