4

使用以下命令bash

python myscript.py filename_pattern*

sys.argv在两台 Linux 机器上有两个不同的:

  • 机器Asys.argv[1] = filename_pattern*
  • 机器 Bsys.argv[1] = filename_pattern-2013-06-30

注意filename_pattern-2013-06-30是我当前目录中的一个文件。

我的一位同事告诉我,这就是bash. 但是我检查了bash两台机器是相同的版本,我也检查了~/.bashrc/etc/bashrc/etc/profile.d/*.sh

谁能指出两个相同版本的bash行为为何不同?

4

3 回答 3

7

这是因为在您的一台机器上,在文件夹中,没有可以匹配该模式的文件。因此,当这种情况发生时,*仍然存在。您可以使用一台计算机进行测试,有无文件匹配模式。还有另一个原因,shell 选项nullglob被禁用。您可以为此阅读GNU bash 参考资料

于 2013-07-11T07:13:21.240 回答
1

正如评论中所指出的,为什么您在两台机器上看到不同的行为取决于两台机器上目录中存在的文件或基于 shell 选项。

无论哪种方式,避免该问题的方法是简单地将参数括在引号中,以便 Bash 按字面意思对待它。

python myscript.py "filename_pattern*"
于 2013-07-11T07:19:33.927 回答
0

你可以在你的 python 程序中处理它,就像我在一本关于 python 的介绍性书中找到的这个例子。那么 bash 是否扩展它并不重要。

import glob
import sys

sys.argv = [item for arg in sys.argv for item in glob.glob(arg)]
于 2013-07-11T08:00:29.253 回答