Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash是否正在扩展*&引用;python命令行参数中的字符?_Python_Bash - Fatal编程技术网

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”吗?不,谢谢提示。。