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 read retorna imediatamente. Uma solução possível seria fazer o script abrir um novo terminal e executar-se da seguinte forma:
x-terminal-emulator -e $0
Com o emulador x-terminal, o emulador de terminal padrão é chamado. Isso funciona com o Debian & Ubuntu, eu não sei sobre outras distros. Você pode chamar um terminal específico como o xterm, o konsole ou qualquer outro terminal, é claro.
$0
é o caminho do arquivo do script, então isso sempre funciona.
Você também precisa ter certeza de que não abra mais terminais de maneira recursiva. Uma maneira de isso funcionar é verificar se você pode ler stdin, como você já fez de qualquer maneira:
The return code of the read command is zero, unless an end-of-file character is encountered, if read times out or if an invalid file descriptor is supplied as the argument to the -u option.
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 questão se você precisar manter o terminal aberto após o término do programa.