Я не нашел решения этого после некоторых поисков. Я думаю, что условия поиска слишком общие. Я хотел бы знать, как выполнить ряд строк (в приглашении bash), которые генерируются каким-либо другим источником. Например, у меня есть сценарий Python, который динамически генерирует ряд команд bash и print
s их на стандартный вывод. Я бы хотел, чтобы эти строки выполнялись как сценарий 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 делает.