在Bash中,是否保证通配符扩展?

Bash中通配符的扩展是否保证按字母顺序排列? 我被迫将一个大文件分割成10Mb的部分,以便我们的Mercurial知识库可以接受它们。

所以我想我可以使用:

split -b 10485760 Big.file BigFilePiece. 

然后代替:

 cat BigFile | bigFileProcessor 

我可以:

 cat BigFilePiece.* | bigFileProcessor 

在它的地方。

然而,我无法find任何可以确保星号(也称为通配符,aka * )的扩展总是按照字母顺序排列的地方,以便.aa.ab之前(相对于时间戳sorting或类似的东西)。

另外,我的计划中是否有缺陷? 收集文件的性能成本有多大?

是的,globbing扩展是按字母顺序的。

从Bash man页:

path名称扩展

  After word splitting, unless the -f option has been set, bash scans each word for the characters *, ?, and [. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of file names matching the pattern. 

这是bashlogging行为,所以你可以在你的脚本中依赖它。 对于其他Bourne兼容的shell,在很长一段时间内也是如此……尽pipe可能存在关于案例折叠或非字母数字字符的angular落案例。

(所得到的列表在bash中几乎是“ASCII-betical”顺序—除了小写字母和大写字母将被整理在一起,就好像没有任何区别,而是在小写字母大写之前进行整理。非字母表应按照它们在ASCII中出现的顺序排列)。

正如其他人指出的,这可能会受到您的语言相关的环境设置的干扰:一般LANG和LC_COLLATE更具体。 在env命令下运行取决于全局扩展顺序的命令可能是最安全的(使用-i-u来清除环境),或者通过sort结果来确保强大的sorting。

虽然glob扩展按字母顺序sorting,但它们也遵循shell的语言设置。

如果你希望这是可移植的,请确保在脚本中将其设置为“C”。