4

Скажем, у меня есть скрипт bash:

#!/bin/bash

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

Если скрипт вызывается с чем-то пронизывающим, например:

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

Тогда команда read будет читать из канала. Даже если я попытаюсь очистить stdin до того, как нажму эту команду read , она все равно немедленно вернется.

Есть ли способ обойти это? Если у меня нет никакого контроля над тем, как вызывается мой скрипт, есть ли способ заставить его принять ввод для read или select из терминала? Если нет, есть ли какие-нибудь хитрые способы приостановить работу сценария, чтобы получить ввод от пользователя, отличного от stdin?

1 ответ1

5

Да. Терминал всегда /dev/tty . Все, что нужно, это read получить его ввод из терминала, а не из stdin:

#!/bin/bash

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

В процессе работы это выглядит так:

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

Немного более сложный способ сделать то же самое

Здесь мы открываем /dev/tty как дескриптор файла 3. Опция -u 3 указывает read использовать файловый дескриптор 3:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .