Bash是否在我的python命令行参数中扩展了“*”字符?

时间:2013-07-11 06:58:11

标签: python bash

bash中使用以下命令:

python myscript.py filename_pattern*

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

  • 计算机A sys.argv[1] = filename_pattern*
  • 机器B sys.argv[1] = filename_pattern-2013-06-30

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

我的一位同事告诉我,这是bash的邪恶。但我检查两台计算机中的bash版本是否相同,我也检查了~/.bashrc/etc/bashrc/etc/profile.d/*.sh

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

为什么您会看到两台计算机上的不同行为是指向两台计算机上目录中的文件,或者基于shell选项,如评论中所指出的那样。

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

python myscript.py "filename_pattern*"

答案 2 :(得分:0)

你可以在你的python程序中处理它,就像我在python的入门书中找到的这个例子。那么bash是否扩展它无关紧要。

import glob
import sys

sys.argv = [item for arg in sys.argv for item in glob.glob(arg)]