2015-05-11 56 views
2

Bash是否支持命令行参数中的转义空格?如何在Bash命令行参数中转义空格

我有一个简单的Python脚本中使用argparse摆脱猛砸传递的参数,但是当我把它想:

myscript.py --name="Some Text With Spaces" 

我得到这样一个结果:

args = ['Text', 'With' Spaces'] 
kwargs = {'name': 'Some'} 

我虽然猛砸支持带有“\”但尝试的空格

myscript.py --name="Some\ Text\ With\ Spaces" 

结果是一样的。

我是否滥用Bash,或者这是我必须在Python方面处理的问题?

+0

难道你尝试没有'='标志? – thefourtheye

+3

**你究竟是在调用python脚本?正在运行的命令来自哪里? (你需要*空格中的*引号或反斜杠,但不能同时包含这两个字符。) –

+0

@thefourtheye在任何情况下,这都不会影响分词。这听起来更像是使用一个字符串来保存一个复杂的命令,不正确地使用'eval'等。 –

回答

6

从bash结束来看,最可能的原因是你没有告诉我们关于你的bash代码的真相。你打的很像BashFAQ #50

运行

myscript.py --name="Some Text With Spaces" 

...直接从命令行完美地工作,从而导致sys.argv阵列的['myscript.py', '--name=Some Text With Spaces']。您所描述的行为是与此一致:

cmd='myscript.py --name="Some Text With Spaces"' 
$cmd 

...这将导致sys.argv阵列的['myscript.py', '--name="Some', 'Text', 'With', 'Spaces"']


不要这样做,永远。无论是使用数组(通常是合适的,如果你需要有条件地建立一个参数线):

cmd=(myscript.py --name="Some Text With Spaces") 
"${cmd[@]}" 

...或函数(通常在其他情况下,适当选择):

myscript() { myscript.py --name="Some Text With Spaces" "[email protected]"; } 
myscript 
+0

我不建议将命令名存储在数组中。只有在这种简单的命令加上它的论据的情况下,这样的扩张才有效。例如,您不能在阵列中包含管道或I/O重定向。该功能是更好的选择。 – chepner

+0

取决于用例。如果命令完全处于变量中的原因是有条件地构建其内容,那么函数可能不是适合工作的正确工具。 BashFAQ#50进入妥协;我在这里增加了一些指导,但宁愿人们阅读精美的FAQ。 :) –

+0

没有看到OP建议接受这样的构建命令,我会犯错的一方不执行任意代码。 – chepner

相关问题