это мой код

bash << EOF
  read
  EOF

здесь, команда чтения терпит неудачу, и она не читает с ввода std

и здесь

bash << EOF
  read
  ls
  ls
  EOF

выполняется только второй ls (первый ls был перенаправлен на чтение как ввод?)

Может кто-нибудь сказать мне, что я делаю не так здесь? все команды, которые ожидают ввода от ввода std, терпят неудачу

1 ответ1

1

Синтаксис <<word ("Здесь документы") перенаправляет стандартный ввод. Итак, что вы сделали, это запустили bash, чей стандартный ввод перенаправлен в "здесь документ". Когда этот bash запускает дочерние элементы (или выполняет встроенные команды), они наследуют стандартный ввод от bash, поэтому они также читают из документа здесь. (Здесь нет ничего особенно загадочного в документах. Одна из возможностей реализации состоит в том, чтобы скопировать документ здесь во временный файл, а затем перенаправить стандартный ввод в этот файл. Bash может сделать это при определенных обстоятельствах.)

Перенаправление стандартного ввода - не единственный способ заставить bash выполнить файл. Вы можете просто дать bash имя файла в командной строке. Опять же, вам не нужен настоящий файл, чтобы это работало; Вы можете использовать процесс подстановки, например так:

bash <(echo '
 read -p "Say it: " A
 echo You said $A
')

Поскольку это не перенаправляет стандартный ввод, read будет считываться со стандартного ввода, а не с команд, подаваемых в bash.

Остерегайтесь проблем с цитатами: они дважды кусали меня, печатая этот простой пример.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .