Вопрос или проблема
Я хочу сделать что-то вроде этого:
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
Давайте разберем, что происходит в этой команде:
-
Группировка процессов: Использование скобок
()
создает подгруппу процессов. Это позволяет выполнять командыecho
иcat
в контексте группы, которая взаимодействует с оболочкойsh
. -
Команда echo: Команда
echo "whoami"
выводит строкуwhoami
, которая будет передана в стандартный ввод оболочкиsh
. -
Команда cat: Использование
cat
без аргументов делает его ожидание ввода, что позволяет оставить канал открытым для взаимодействия. Таким образом, пользователь может продолжать вводить данные в интерактивном режиме после выполнения командыwhoami
. -
exec: Использование
exec sh
заменяет текущий процесс оболочки на новый процессsh
, который будет интерактивным. Это означает, что вы получаете полноценную оболочку, в которой можно выполнять другие команды.
Таким образом, результат выполнения данной конструкции будет таков: после запуска команды вы получите интерактивную оболочку sh
, сразу после выполнения команды whoami
, и сможете вводить новые команды прямо в ней.
Итог
Этот метод удобен для работы с интерактивными интерпретаторами, которые не поддерживают опцию -c
, и позволяет отправлять команды в оболочку, не завершая её после первой операции. Так вы сможете работать с интерактивными программами через конвейеры, что существенно расширяет возможности использования оболочки Bash.
Специализированное понимание этих механизмов является необходимым для эффективной работы с командной строкой и написания сложных скриптов. Рассматриваемый подход открывает множество возможностей для автоматизации и интеграции различных инструментов и программ.