这是一个错误吗?
#!/usr/bin/env python3.6
# filename: tmp.py
import sys
print(sys.argv)
调用:
python tmp.py find . -name '*.py'
实际输出:
['tmp.py', 'find', '.', '-name', '*.py']
预期产出:
['tmp.py', 'find', '.', '-name', "'*.py'"]
请注意实际输出中缺少报价。
答案 0 :(得分:4)
不,因为你的shell在将参数传递给python之前删除了引号(否则它会展开 python tmp.py find -name "'*.py'"
通配符)
获得你想要的东西:
'*.py'
请注意,此行为取决于shell。在Windows上,因为单引号没有特别的意义,传递['tmp.py', 'find', '.', '-name', "'*.py'"]
,你会得到:
glob.glob
另请注意,受到引用保护的通配符在python方面没有任何实际意义,因为您需要删除引号才能使用refresh_token
评估它们
答案 1 :(得分:2)
shell负责将其运行的命令分解为C字符串列表。 然后将这些字符串传递给正在运行的程序。
在示例中:
python tmp.py find . -name '*.py'
...正确实现的shell将为the execve
syscall的argv
元素生成的参数列表看起来像(在C语法中),如:
char[][]{ "python", "tmp.py", "find", ".", "-name", "*.py", NULL }
当Python运行时,它不知道原始命令是什么:它无法知道你是否输入了'*.py'
或\*.py
或任何其他东西;它只看到shell传递给操作系统的参数列表。