É possível obter um script bash para aceitar entrada do terminal se o seu stdin tiver sido redirecionado?

4

Digamos que eu tenha um script bash:

#!/bin/bash

read -p "Gimme some stuff: " stuff
echo "**${stuff}**"

Se o script for invocado com alguma coisa, como:

echo "Here's some stuff" | ./myscript.bash

Em seguida, o comando read será lido no pipe. Mesmo se eu tentar limpar o stdin antes de eu acertar o comando read , ele ainda retorne imediatamente.

Existe alguma maneira de contornar isso? Se eu não tiver nenhum controle sobre a maneira como meu script é invocado, existe alguma maneira de forçá-lo a aceitar a entrada de um read ou select do terminal? Se não, há alguma maneira furtiva de pausar o script para obter informações de um usuário que não seja de stdin?

    
por glibdud 01.11.2014 / 01:52

1 resposta

5

Sim. O terminal é sempre /dev/tty . Tudo o que é necessário é ter read obtendo sua entrada do terminal em vez de stdin:

#!/bin/bash

read -p "Gimme some stuff: " stuff </dev/tty
echo "**${stuff}**"

Em funcionamento, parece que:

$ echo asdfdsaf | read.sh
Gimme some stuff: 123
**123**

Uma maneira um pouco mais complexa de fazer a mesma coisa

Aqui abrimos /dev/tty como descritor de arquivo 3. A opção -u 3 diz read para usar o descritor de arquivo 3:

exec 3<>/dev/tty
read -u 3 -p "Gimme some stuff: " stuff
echo "**${stuff}**"
    
por 01.11.2014 / 02:22