stdin из heredoc не выводится на экран?

#bash #zsh #heredoc

Вопрос:

У меня есть программа, которая интерактивно регистрирует пользователя. Я использовал heredoc для автоматизации процесса.

 ./login <<EOF
user1@test.com
password
EOF
 

Я ожидал, что результат будет примерно таким. Это то, что отображается, когда я запускаю программу без heredoc и сам вводю имя пользователя и пароль.

 $ ./login
Enter your email: user1@test.com
Enter your password: password
Successfully logged in.
 

Однако я вижу только это.

 $ ./login
Enter your email: 
Enter your password: 
Successfully logged in.
 

Как вы можете видеть, все входные данные heredoc не распечатаны, хотя программа, похоже, правильно вводит stdin. В чем причина этого? Было бы здорово, если бы я все еще мог видеть эти входные данные, которые помогли бы мне отлаживать проблемы. Спасибо.

Комментарии:

1. Вы отметили как bash, так и zsh; используете ли вы одно, другое или оба? (Казалось бы, ваш ./login сценарий будет использовать только один…

2. Видеть, как вход отражается на терминале, — это особый случай, когда сам терминал является стандартным входом. Стандартный ввод в целом не отражается эхом.

Ответ №1:

login Программа отключает локальное эхо (см. https://man7.org/linux/man-pages/man1/stty.1.html).

Обновить

Если login программа написана вами, то это намного проще, просто echo значения после их прочтения

Комментарии:

1. Программа входа в систему написана мной. У меня нет кода, чтобы отключить эхо. Это только чтение из stdin.

Ответ №2:

ECHO — это функция tty, когда пользователи вручную вводят символы в tty. Вы ./login << ... не получаете входные данные от tty, поэтому heredoc не повторяется. Это так же, как, например,

 grep something < /some/file
 

где вы не хотите, чтобы он повторял данные всего файла.