作者:歌歌了_618 | 来源:互联网 | 2023-10-11 12:31
Thisanswer讨论了如何从终端中的命令行运行多行Python片段.我注意到答案在shell脚本中很有用,即使是嵌套缩进,这非常好,例如#!binbashsome_textH
This answer讨论了如何从终端中的命令行运行多行Python片段.我注意到答案在shell脚本中很有用,即使是嵌套缩进,这非常好,例如
#!/bin/bash
some_text="Hello world"
echo $some_text
cat <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
但是,我很难在shell脚本和Python片段之间共享变量.
>如何在bash脚本中收集python下标的输出? (例如在$output等变量中).
>如何将bash变量(例如$some_text)传递给Python脚本?
解决方法:
获取Python的变量
由于(当没有引用EOF标记时)变量替换发生在将文本从heredoc传递到python的标准输入之前,您可以在脚本中正确抛出变量.
python - <some_text = "$some_text"
EOF
如果some_text被测试,python会看到some_text =“test”.但请注意,它可以被视为代码注入漏洞.如果some_text是“; import os; os.system(”evil-command“); x =”,例如,python会看到:
some_text = ""; import os; os.system("evil-command"); x = ""
并运行那个邪恶的命令.
如果您希望能够将Python代码直接引入脚本而不进行任何修改,则可以导出变量.
export some_text
并使用os.environ来检索它.
some_text = os.environ['some_text']
这是一种更安全/更安全的方法.
从Python获取输出
您可以使用命令替换来收集脚本的输出.
output=$(
python - <import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
)
(请注意,所有尾随的换行符都已删除)