Способ 1: получить пользовательский ввод через stderr
Проблема в stdin для оболочки - это процесс cat
, и, по-видимому, вам захочется задать вопрос пользователю.Один из способов сделать это:
$ cat hoge.sh
#!/bin/sh
read yn <&2
echo "yn is $yn"
Это говорит read
, что он получает свой стандартный ввод из stderr, а не процесс cat
.Поскольку stderr не был перенаправлен, он по-прежнему является терминалом
В процессе работы он выглядит следующим образом:
$ cat hoge.sh | sh
y
yn is y
Метод 2: Получение пользовательского ввода непосредственно с терминала
$ cat hoge.sh
#!/bin/sh
read yn </dev/tty
echo "yn is $yn"
Когда это сделано, команда read
получит свой ввод от терминала, и любая попытка перенаправления ввода / вывода будет проигнорирована.Это может быть преимуществом или недостатком в зависимости от ваших требований.