Назад | Перейти на главную страницу

Bash: выполнение конвейерных строк из stdin

Я не нашел решения этого после некоторых поисков. Я думаю, что условия поиска слишком общие. Я хотел бы знать, как выполнить ряд строк (в приглашении bash), которые генерируются каким-либо другим источником. Например, у меня есть сценарий Python, который динамически генерирует ряд команд bash и prints их на стандартный вывод. Я бы хотел, чтобы эти строки выполнялись как сценарий bash без необходимости сохранять их на диск. Например:

$ python example.py
touch 1 2 3 4 5
rm 1 2 3 4 5
echo "Done"

Я бы хотел сделать что-то вроде:

$ python example.py | executeLines

Существует ли такая команда / функция в bash? Иногда одна из команд может завершиться с ненулевым статусом выхода, поэтому добавление && к каждой команде, а затем запускается:

$ `python example.py`

не всегда будет работать и кажется корявым решением.

Ты пробовала

$ python example.py | bash

Это должно сработать, поскольку это довольно распространенный трюк. Например, у инструмента мониторинга munin есть конфигуратор узлов (munin-node-configure), который сообщает вам, какие плагины вы можете запускать, а затем принимает --shell флаг, из-за которого он выплевывает кучу ln -s команды для ссылки в плагинах, когда они передаются напрямую в bash.

Был даже когда-то инструмент для настройки чего-то - это было более 15 лет назад, я не могу вспомнить, что - где вы становились root и выполняли настройку, открыв сеанс telnet в автоконфигураторе и отправив вывод прямо в bash , с участием

# telnet example.com 7001 | bash

Я не могу представить делает что-нибудь подобное в наши дни.

Я бы сделал это:

python example.py | while read command; do $command; done

Ненулевой статус выхода можно обойти, используя ; вместо того &&, Кстати.

Другой метод, который вы можете использовать вместо соединения с подпроцессом bash, - это eval встроенная оболочка для случаев, когда вам нужно, чтобы сгенерированный код оболочки полагался на что-то в вашей текущей среде оболочки или вы хотите, чтобы выходные данные вашей программы включали такие действия, как установка переменных среды в текущем процессе оболочки.

Например, предположим, что ваш результат был примерно таким:

$ python example.py
PATH="$PATH:/opt/wackysoft/bin"
export PATH
echo $PATH
which wackysoft-command

Вы можете оставить измененное PATH переменная среды в текущем сеансе, поэтому вы должны использовать eval. Например:

$ eval "`python example.py`"
/bin:/sbin:/usr/bin:/usr/sbin:/opt/wackysoft/bin
/opt/wackysoft/bin/wackysoft-command
$ echo $PATH
/bin:/sbin:/usr/bin:/usr/sbin:/opt/wackysoft/bin
$ which wackysoft-command
/opt/wackysoft/bin/wackysoft-command

Это похоже на то, как программы вроде ssh-agent обычно вызываются в файлах конфигурации .xsession или .profile.

Разве вы не можете просто выполнить их как подпроцессы изнутри вашего скрипта Python с помощью os.system вызов?

Вы ищете именно то, что xargs делает.