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

3

当在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键自动补全。

是否有可能防止命令行参数被扩展?


我不理解你在说什么关于tab,也不明白使用Python中的glob模块时你缺少了什么。 - janos
你想要输出像CASE 2那样的结果吗?如果是,就不要使用“*”。 - Mr Sam
不,你不能这样做。 - melpomene
@Rightleg,您不必返回插入引号。如果您自动完成参数直到 file_00,则可以附加 \*"*"。因此,例如命令行可能看起来像 python stuff.py file_00"*",传递给 Python 的参数将是 file_00*,并且 glob 模块将按照应有的方式处理它。 - janos
@janos 嗯,这不是我预期的,但是...我必须承认它相当不错。如果我可以用一个反斜杠来避免星号,那么痛苦就会减轻一些...我对此感到满意,非常感谢。 - Right leg
显示剩余3条评论
1个回答

3

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

将参数传递给shell时唯一的方法是引用或使用适当的转义来避免其被展开。 具体而言,需要引用或转义shell尝试展开的部分。

然而,这需要在参数周围添加引号,因此不能直接使用tab键自动补全。

不需要在整个参数周围添加引号,只需在shell中具有特殊含义的字符周围添加即可。

例如,如果你通过自动补全命令行来完成这个命令:

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

如果你想在不被shell解释的情况下将字面值*添加到file_00*以传递给Python脚本,可以这样写:

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

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

正如我所评论的那样,这不是我期望的答案,但这仍然让我满意。谢谢! - Right leg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接