Вы читали со стандартного ввода с помощью 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)
.
Благодаря steeldriver за его комментарий, он привел меня к ответу.
Оператор канала работает только тогда, когда команда принимает аргументы из стандартного ввода, в этом случае такие команды, как touch или rm, не поддерживаются, альтернативным решением является использование подстановки команд, как в примере
touch $(echo {1..3})
Или с помощью xargs, который преобразует ввод из стандартного ввода в аргументы в команду, что, следовательно, возможно
echo {1..3} | xargs touch
так просто