В этом ответе обсуждается, как запустить многострочный фрагмент Python из командной строки в терминале. Я заметил, что ответ прекрасно работает в сценариях оболочки, даже с вложенными отступами, что очень хорошо, например
#!/bin/bash
some_text="Hello world"
echo $some_text
cat <<EOF | python -
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
печатает:
0
hello
hello
1
hello
hello
2
hello
hello
Тем не менее, я испытываю трудности с разделением переменных между сценарием оболочки и фрагментом Python.
Как я могу собрать выходные данные индекса Python в скрипте bash? (например, в переменной, такой как
$output
).Как я могу передать переменную bash (например
$some_text
) в скрипт Python?
python - <<EOF
вместо этого.Ответы:
Получение переменной в Python
Поскольку (когда
EOF
маркер не указан в кавычках), подстановка переменной происходит до того, как текст передается из heredoc вpython
стандартный ввод в России, вы можете бросить переменную прямо в сценарий.Если бы
some_text
былоtest
, Python увидел быsome_text = "test"
. Однако обратите внимание, что это можно рассматривать как уязвимость внедрения кода. Если быsome_text
был"; import os; os.system("evil-command"); x = "
, например, Python увидел бы:и выполнить эту злую команду.
Если вы хотите иметь возможность вставить свой код Python прямо в скрипт без каких-либо изменений, вы можете экспортировать свою переменную.
и использовать,
os.environ
чтобы получить его.Это гораздо разумнее / безопаснее.
Получение вывода из Python
Вы можете использовать подстановку команд для сбора выходных данных скрипта.
(обратите внимание, что все завершающие символы новой строки удалены)
источник
"You could also pass the variable to the script as an argument"
, как бы вы это сделали, учитывая, что скрипт Python встроен в скрипт оболочки?print '$SHELL'
, результат будет/bin/bash
или то, чем будет ваша оболочка. Если вы измените первую строку наpython - <<'END'
, будет вывод$SHELL
. Если вы копируете и вставляете существующий код для встраивания в bash-скрипт, вам почти наверняка не нужны замены оболочки - вы хотите, чтобы код работал так же, как и в случае, если он не встроен в bash-скрипт, верно?Проблема с вашим подходом заключается в том, что встроенный скрипт Python больше не имеет доступа к исходному стандартному стандартному входу (поскольку его стандартный ... сам по себе).
Если это проблема, вы можете написать:
Или, если скрипт Python может содержать одинарные кавычки:
Или:
источник
Используйте тире в качестве имени файла:
Я не знаю,
sys.argv[1:]
является ли правильный способ сделать это в Python. Для -e / -c вы можете указать конец аргумента с помощью -:Захват вывода и перенаправление STDERR:
источник
1) Вы можете записать переменные в файл на python, а затем получить его в своем скрипте bash.
2) Поскольку ваше слово (EOF) не заключено в кавычки, все строки здесь-документа подвергаются расширению параметров. Вы можете использовать это для передачи содержимого в скрипт Python.
источник