我一直在阅读an implementation的glob
,并使用Ubuntu Bionic和Trusty对其进行测试。
在高级别上,我对两个目录使用/foo/*/bar
标志测试了诸如GLOB_NOSORT
之类的模式:
/foo/A/bar/
/foo/3/bar/
是,我知道我使用了NOSORT
,但我不想使用[[sorting。但是,顺序是100%可重复的:
A
之前获得3
,并且每次在Bionic上运行时,我都会在3
之前获得A
。glob手册描述的行为是:
不对返回的列表进行排序。默认情况下,列表按字母顺序排序。此标志导致文件按照在目录中找到的顺序返回。
但是,它们在目录中的顺序是什么?该“自然”顺序来自何处,为什么它总是可重复的,以及为什么在这两个OS版本之间会发生变化?
getdents()
的调用返回的内容。那里的目录索引不是排序的,而是以某种优化的数据结构来按name查找。因此,从理论上讲,枚举的顺序可以从一个时刻到另一个时刻变化。
同样,对于ext4,您不能假设任何特定顺序,即使它在每次通话之间都保持稳定。只要没有写任何内容,它就[[通常]]是稳定的,但是即使这样也不能保证。内核版本的差异还涉及对ext4代码库的大量修改;我想很难(但并非不可能)在某处发现代码中的差异,这就是导致您观察到的差异的原因。