Bash是否正在扩展*&引用;python命令行参数中的字符?
使用Bash是否正在扩展*&引用;python命令行参数中的字符?,python,bash,Python,Bash,使用bash中的以下命令: python myscript.py filename_pattern* 我在两台Linux机器上得到了两个不同的sys.argv: 机器A:sys.argv[1]=filename\u pattern* 机器B:sys.argv[1]=filename\u pattern-2013-06-30 注意:文件名\u pattern-2013-06-30是我当前目录中的一个文件 我的一位同事告诉我这就是bash的罪恶所在。但是我检查了两台机器中的bash是同一版本的
bash
中的以下命令:
python myscript.py filename_pattern*
我在两台Linux机器上得到了两个不同的sys.argv
:
- 机器A:
sys.argv[1]=filename\u pattern*
- 机器B:
sys.argv[1]=filename\u pattern-2013-06-30
文件名\u pattern-2013-06-30
是我当前目录中的一个文件
我的一位同事告诉我这就是bash
的罪恶所在。但是我检查了两台机器中的bash
是同一版本的,我还检查了~/.bashrc
,/etc/bashrc
,/etc/profile.d/*.sh
有人能指出为什么两个相同版本的bash的行为不同吗?这是因为在您的一台机器的文件夹中,没有与模式匹配的文件。因此,当这种情况发生时,
*
仍然存在。您可以使用一台计算机进行测试,无论是否有与模式匹配的文件。还有另一个原因,shell选项nullglob被禁用。对此,您可以阅读。为什么在这两台机器上看到不同的行为,可能是由于两台机器的目录中都有文件,也可能是基于shell选项,如注释中所指出的
无论哪种方式,避免问题的方法都是简单地用引号括住参数,以便Bash按字面意思处理它
python myscript.py "filename_pattern*"
您可以在python程序中处理它,就像我在一本介绍python的书中找到的这个示例一样。那么bash是否扩展它就无关紧要了
import glob
import sys
sys.argv = [item for arg in sys.argv for item in glob.glob(arg)]
两台机器上的
shopt | grep nullglob
结果如何?请参阅本页了解解释:机器A上是否存在文件“filename_pattern-2013-06-30”吗?不,谢谢提示。。