Подстановка Pipe vs Command

Вы читали со стандартного ввода с помощью read, но вы читали следующую строку стандартного ввода -, а именно echo "Hello $NAME". После прочтения этой строки больше не было ввода и, следовательно, никаких дальнейших команд для выполнения, и сценарий был завершен.

Существует только один стандартный поток ввода, и вы пытаетесь использовать его как для кода, так и для данных. Это то же самое, как интерактивный сеанс bashсчитывает команды из вашего ввода, а также ответы read, а также любые другие команды, для которых вы хотите использовать стандартный ввод.

Вы можете увидеть, как это происходит, если мы добавим дополнительную строку в конец скрипта:

echo "Please say name:"
read NAME
echo "Hello $NAME"
printf 'name=%s\n' "$NAME"

Это обеспечивает дополнительную команду, чтобы увидеть продолжение выполнения скрипта, и показывает нам, что было прочитано вNAME:

Please say name:
name=echo "Hello $NAME"

Вы можете видеть, что переменная содержит дословно то, что было написано в файле скрипта -никакой интерполяции, выполнения или расширения переменных не произошло.


Если вы хотите readс терминала, это возможно. Самый простой способ, который может сработать, — это чтение из стандартного вывода вместо стандартного ввода (! ), который предположительно подключен к TTY:

read NAME <&1

Это будет ждать, пока я что-нибудь наберу, а затем перейду к остальной части программы. Вы также можете использовать /dev/ttyили $(tty).

0
12.04.2021, 00:38
1 ответ

Благодаря steeldriver за его комментарий, он привел меня к ответу.

Оператор канала работает только тогда, когда команда принимает аргументы из стандартного ввода, в этом случае такие команды, как touch или rm, не поддерживаются, альтернативным решением является использование подстановки команд, как в примере

touch $(echo {1..3})

Или с помощью xargs, который преобразует ввод из стандартного ввода в аргументы в команду, что, следовательно, возможно

echo {1..3} | xargs touch

так просто

4
28.04.2021, 22:53

Теги

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