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