从bash命令行获取未扩展的参数

时间:2017-07-01 14:58:11

标签: python bash command-line

当通过bash命令行将glob表达式作为参数传递给脚本时,它会被展开,并且与之匹配的文件将解压缩到sys.argv中:

# stuff.py
import sys

print(sys.argv)
host:~$ python stuff.py a*
['stuff.py', 'a1', 'a2', 'a3']

我想将这些文件作为sys.argv

的单个元素放在容器中
host:~$ python stuff.py a*
['stuff.py', ['a1', 'a2', 'a3']]

我知道将glob表达式放在引号中并使用glob模块解决了这个问题:

import sys
import glob

print(glob.glob(sys.argv[1]))
host:~$ python stuff.py "a*"
['a1', 'a2', 'a3']

但是,这需要在参数周围添加引号,因此不能直接使用制表符完成。

是否可以阻止扩展命令行参数?

1 个答案:

答案 0 :(得分:3)

  

从bash命令行获取未扩展的参数

传递shell未展开的参数的唯一方法是引用它或使用适当的转义。 具体来说,引用或转义shell试图扩展的部分。

  

但是,这需要在参数周围添加引号,因此不能直接使用制表符完成。

您不需要在整个参数周围添加引号。 对于在shell中具有特殊含义的字符来说,这就足够了。

例如,如果您自动完成此命令行,直到此时为止:

python stuff.py file_00
                       ^ cursor is here, and you have many files,
                         for example file_001, file_002, ...

此时,如果要添加文字*以将file_00*传递给Python脚本而不用shell解释它, 你可以这样写:

python stuff.py file_00\*

或者像这样:

python stuff.py file_00'*'

作为另一个例子, 请注意,当文件模式包含空格时, 选项卡完成将正确添加\,例如:

python stuff.py file\ with\ spaces\ 00

您也可以像往常一样添加转发的*

python stuff.py file\ with\ spaces\ 00\*

总之, 你可以自然地使用标签完成, 选项卡完成后,只转义特殊字符。 然后使用glob Python模块展开参数中的glob部分。