Интерактивная оболочка с использованием стандартного ввода - PullRequest
0 голосов
/ 28 января 2019

Я хотел бы запустить сценарий оболочки, в котором есть интерактивные части внутри трубы.

Например,

cat hoge.sh | sh

и hoge.sh

#!/bin/sh
read yn
echo "yn is $yn"

В этом случае sh hoge.sh работает, но cat hoge.sh | sh нет.

Какой вариант мне выбрать?или это невозможно?надеюсь, я создаю сценарий, следующий за POSIX.

1 Ответ

0 голосов
/ 28 января 2019

Способ 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 получит свой ввод от терминала, и любая попытка перенаправления ввода / вывода будет проигнорирована.Это может быть преимуществом или недостатком в зависимости от ваших требований.

...