Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-c与python-<&书信电报;埃雷多克_Python_Bash_Heredoc - Fatal编程技术网

python-c与python-<&书信电报;埃雷多克

python-c与python-<&书信电报;埃雷多克,python,bash,heredoc,Python,Bash,Heredoc,我试图在Bash脚本中运行一些Python代码,因此我想了解以下两者之间的区别: #!/bin/bash #your bash code python -c " #your py code " vs python-使用here文档的主要缺陷是脚本的标准输入将是here文档。因此,如果您有一个想要处理其标准输入的脚本,python-c几乎是您唯一的选择 另一方面,使用python-c'…'可以根据shell的需要绑定单引号,因此在python脚本中只能使用双引号字符串;使用双引号来保护脚本不受

我试图在Bash脚本中运行一些Python代码,因此我想了解以下两者之间的区别:

#!/bin/bash
#your bash code

python -c "
#your py code
"
vs


python-使用here文档的主要缺陷是脚本的标准输入将是here文档。因此,如果您有一个想要处理其标准输入的脚本,
python-c
几乎是您唯一的选择

另一方面,使用
python-c'…'
可以根据shell的需要绑定单引号,因此在python脚本中只能使用双引号字符串;使用双引号来保护脚本不受shell的影响会带来额外的问题(双引号中的字符串会经历各种替换,而单引号中的字符串在shell中是文本)

另一方面,请注意,您可能也希望单引号引用here doc分隔符,否则Python脚本将进行类似的替换

python - <<'____HERE'
print("""Look, we can have double quotes!""")
print('And single quotes! And `back ticks`!')
print("$(and what looks to the shell like process substitutions and $variables!)")
____HERE

python-如果您喜欢使用
python-c'…'
而不必使用双引号转义,您可以首先使用here文档将代码加载到bash变量中:

read -r -d '' CMD << '--END'
print ("'quoted'")
--END
python -c "$CMD"

read-r-d''CMD如果您使用的是bash,那么如果您应用多一点样板文件,就可以避免herdoc问题:

python <(cat <<EoF

name = input()
print(f'hello, {name}!')

EoF
)

如果脚本无法运行,这将保留脚本。

在第一个示例中,如果要使用带双引号的字符串,则需要对双引号进行转义。好的,尽管如此,这是一个方面。其他人更喜欢哪一个呢?这确实是一个关于这里的问题,而不是关于PythonI的问题。我不理解你关于向shell返回值的评论。这两个构造都打印到标准输出并返回退出代码,如果您愿意,shell可以检查这两个代码。您需要为python打印到标准输出的输出读取shell。e、 g.#/bin/bash函数current\u datetime{python-尽管
date
命令可能更适合该特定用例。此外,请再次引用字符串。您可以使用
'\''
将单个引号“嵌入”到shell中的单引号字符串。例如,
echo'Say'\''Hello'\'',Fred'
。是的,对于单引号字符串的其余部分,这是一个结束单引号、一个未加引号但反斜杠转义的文本单引号和一个开始单引号。这对于日常使用来说可能太复杂且不可读,但如果您只有一个或两个这些都是可行的。同义地说,你可以用双引号引用单独的文字单引号-
“”
;我喜欢称之为“跷跷板引用”.1但完成后应该删除临时文件。请参见上面的例子,如果脚本工作正常,该文件将被删除。使用
trap
将需要一些控制样板文件,我认为在大多数情况下这是不必要的复杂性。是的,对于临时黑客来说,这很好。只需指出不完全显而易见的问题如果有人想在生产脚本中执行此操作,请与我们联系。我在生产脚本中执行此操作。我使用的额外功能是在cron中设置
find
,对文件的年龄设置一些限制。当我应用此技术时,脚本是一个导入和函数调用。我认为真正的问题是,此技术应该是一种缓和措施,可以缓解在shell脚本中需要一个简单的业务逻辑,您没有时间或金钱来改进python模块。从安全角度来看,与此不同的任何事情,如处理用户输入或公开实际功能,都是非常危险的。副作用是不可以的,IMHO;您应该改进模块。
python <(cat <<EoF

name = input()
print(f'hello, {name}!')

EoF
)
#!/bin/bash

temp_file=$(mktemp my_generated_python_script.XXXXXX.py)

cat > $temp_file <<EoF
# embedded python script
EoF

python3 $temp_file && rm $temp_file