Синтаксис <<word
("Здесь документы") перенаправляет стандартный ввод. Итак, что вы сделали, это запустили bash, чей стандартный ввод перенаправлен в "здесь документ". Когда этот bash запускает дочерние элементы (или выполняет встроенные команды), они наследуют стандартный ввод от bash, поэтому они также читают из документа здесь. (Здесь нет ничего особенно загадочного в документах. Одна из возможностей реализации состоит в том, чтобы скопировать документ здесь во временный файл, а затем перенаправить стандартный ввод в этот файл. Bash может сделать это при определенных обстоятельствах.)
Перенаправление стандартного ввода - не единственный способ заставить bash выполнить файл. Вы можете просто дать bash имя файла в командной строке. Опять же, вам не нужен настоящий файл, чтобы это работало; Вы можете использовать процесс подстановки, например так:
bash <(echo '
read -p "Say it: " A
echo You said $A
')
Поскольку это не перенаправляет стандартный ввод, read
будет считываться со стандартного ввода, а не с команд, подаваемых в bash.
Остерегайтесь проблем с цитатами: они дважды кусали меня, печатая этот простой пример.