É possível obter um script bash para aceitar entrada do terminal se o seu stdin foi 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

Então o read comando irá ler a partir do tubo. Mesmo se eu tentar limpar stdin out antes de eu acertar isso read comando, ele ainda retornará imediatamente.

Existe alguma maneira de contornar isso? Se eu não tenho nenhum controle sobre o modo como meu script é invocado, existe alguma maneira de forçá-lo a aceitar entradas para um read ou select do terminal? Se não, há alguma maneira sorrateira de pausar o script para obter a entrada de um usuário diferente do stdin?

glibdud
fonte

Respostas:

5

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

#!/bin/bash

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

Em funcionamento, isso parece:

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

Uma maneira um pouco mais complexa de fazer a mesma coisa

Aqui nós abrimos /dev/tty como descritor de arquivo 3. A opção -u 3 conta read usar o descritor de arquivo 3:

exec 3<>/dev/tty
read -u 3 -p "Gimme some stuff: " stuff
echo "**${stuff}**"
John1024
fonte
/ dev / ttty funciona no Linux. Funciona também em outros sistemas Unix, por ex. Mac OS?
pts