【问题标题】:Get unexpanded argument from bash command line从 bash 命令行获取未扩展的参数
【发布时间】:2017-12-05 08:24:15
【问题描述】:

当从 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,以及你在使用glob Python 模块时缺少什么。
  • 你想要像 CASE 2 这样的输出吗?如果是,就不要使用“*”。
  • 不,你不能那样做。
  • @Rightleg 您不必返回插入引号。如果您在file_00 之前自动完成了参数,则可以附加\*"*"。例如,命令行可能看起来像 python stuff.py file_00"*",传递给 Python 的参数将是 file_00*glob 模块将按原样处理它
  • @janos 嗯,这不是我所期望的,但是......我不得不承认它相当不错。如果我可以用一个反斜杠来避开星号,那么痛苦就会有所缓解......我对此很满意,非常感谢。

标签: python bash command-line


【解决方案1】:

从 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 部分。

【讨论】:

  • 正如我评论的那样,这不是我所期待的答案,但这仍然让我满意。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-04-16
  • 2021-12-02
  • 2016-08-23
  • 2014-01-03
  • 2017-12-11
  • 2019-05-09
  • 2011-09-21
  • 1970-01-01
相关资源
最近更新 更多