Как передавать ввод в интерактивную оболочку в Bash

Вопрос или проблема

Я хочу сделать что-то вроде этого:

echo whoami | sh

Команда whoami выполняется в sh, но поскольку конвейер в целом работает в подпроцессе, интерпретатор sh завершает работу, вместо того чтобы предоставить мне командную строку. Как я могу отправить некоторые входные данные в sh и оставить его работающим без использования аргумента -c?

Мне нужно это знать, потому что sh здесь просто пример; у меня есть другая программа, которая имеет интерактивный интерпретатор, но не имеет эквивалента аргумента -c.

Ваша echo является проблемой, потому что она закрывает трубопровод, как только производит строку whoami\n.

Как насчет

(echo whoami; cat) | exec sh

Ответ или решение

Для того чтобы перенаправить ввод в интерактивную среду оболочки sh в Bash без использования аргумента -c, можно воспользоваться механизмом конвейеров и некоторыми командными конструкциями. Ключевым аспектом здесь является то, что при использовании конвейера (|), если он завершается, то и интерактивный процесс, как правило, также завершится. Однако, существуют методы, позволяющие предотвратить это и отправить команды в интерактивный сеанс, оставляя его запущенным.

Одним из подходов является использование группы процессов с подстановкой и командой cat. Это позволит отправить несколько строк ввода в интерактивную оболочку и продолжить её работу.

Вот пример команды, которая решает эту задачу:

(echo "whoami"; cat) | exec sh

Давайте разберем, что происходит в этой команде:

  1. Группировка процессов: Использование скобок () создает подгруппу процессов. Это позволяет выполнять команды echo и cat в контексте группы, которая взаимодействует с оболочкой sh.

  2. Команда echo: Команда echo "whoami" выводит строку whoami, которая будет передана в стандартный ввод оболочки sh.

  3. Команда cat: Использование cat без аргументов делает его ожидание ввода, что позволяет оставить канал открытым для взаимодействия. Таким образом, пользователь может продолжать вводить данные в интерактивном режиме после выполнения команды whoami.

  4. exec: Использование exec sh заменяет текущий процесс оболочки на новый процесс sh, который будет интерактивным. Это означает, что вы получаете полноценную оболочку, в которой можно выполнять другие команды.

Таким образом, результат выполнения данной конструкции будет таков: после запуска команды вы получите интерактивную оболочку sh, сразу после выполнения команды whoami, и сможете вводить новые команды прямо в ней.

Итог

Этот метод удобен для работы с интерактивными интерпретаторами, которые не поддерживают опцию -c, и позволяет отправлять команды в оболочку, не завершая её после первой операции. Так вы сможете работать с интерактивными программами через конвейеры, что существенно расширяет возможности использования оболочки Bash.

Специализированное понимание этих механизмов является необходимым для эффективной работы с командной строкой и написания сложных скриптов. Рассматриваемый подход открывает множество возможностей для автоматизации и интеграции различных инструментов и программ.

Оцените материал
Добавить комментарий

Капча загружается...