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



当从 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']

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

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

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

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

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

您无需在整个参数周围添加引号。 围绕在外壳中具有特殊意义的字符进行此操作就足够了。

例如,如果在此时之前自动完成此命令行:

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'*'

再举个例子, 请注意,当文件模式包含空格时, Tab 完成将正确添加,例如:

python stuff.py file with spaces 00

在这里,您也可以像往常一样添加转义*

python stuff.py file with spaces 00*

总之, 您可以自然地使用 Tab 补全, 并在制表符完成后仅转义特殊字符。 然后使用 glob Python 模块扩展参数中的 glob 部分。

最新更新