Чтение с tty в конвейерной оболочке

У меня есть сценарий, который запускается следующим образом:

curl https://example.com/install.sh | zsh -

Сценарий должен читать из ввода:

read "human_name?Your human name ?"

Проблема в том, что пользователь видит ввод и может ввести свой ответ, но ответ не сохраняется в human_name.

Пример:

cat <

Результат в:

Your human name ?Pat
tears

Любые указания?

0
19.02.2017, 21:37
1 ответ

Вы всегда можете читать с терминала, перенаправив его с / dev / tty , если программа не является фоновой задачей. Если это фоновое задание, оно будет приостановлено сигналом SIGTTIN, пока не переключится на передний план.

Проблема с вашим скриптом не в чтении с терминала, а в том, что вы делаете с прочитанным. Вы использовали здесь документ с интерполяцией, поэтому $ human_name интерполируется при построении здесь документа, и в то время он пуст. Вам нужно либо использовать здесь документ без интерполяции, либо заключить в кавычки знаки доллара, чтобы оболочка, которую вы запускаете с zsh - , увидела и проанализировала их.

cat <<'EOM' | zsh -
read "human_name?Your human name ?"</dev/tty   
if [ -z "$human_name" ] ; then echo "tears" ; else echo "HI" $human_name; fi
EOM
3
28.01.2020, 02:46

Теги

Похожие вопросы