Bash 如何调试损坏的通配符扩展?

Bash 如何调试损坏的通配符扩展?,bash,shell,Bash,Shell,在我的自动构建中,bash的通配符扩展有时似乎不起作用(与此类似,整个过程都在docker容器中创建的chroot中运行,因此可能有很多原因导致此问题(libc、shell等)出现故障.我尝试使用strace,但结果无助于我分析问题 工作案例的第一行显示扩展文件名: $ ls /tmp/ linux-image-4.9.124.deb $ strace ls /tmp/linux*deb execve("/bin/ls", ["ls", "/tmp/linux-image-4.9.124"...

在我的自动构建中,bash的通配符扩展有时似乎不起作用(与此类似,整个过程都在docker容器中创建的chroot中运行,因此可能有很多原因导致此问题(libc、shell等)出现故障.我尝试使用strace,但结果无助于我分析问题

工作案例的第一行显示扩展文件名:

$ ls /tmp/
linux-image-4.9.124.deb
$ strace ls /tmp/linux*deb
execve("/bin/ls", ["ls", "/tmp/linux-image-4.9.124"...], [/* 23 vars */]) = 0
...
失败的案例表明*没有扩展:

$ ls /tmp/
linux-image-4.9.124.deb
$ strace ls /tmp/linux*deb
execve("/bin/ls", ["ls", "/tmp/linux*deb"], [/* 23 vars */]) = 0
...
set-o
在这两种情况下都显示
noglob off


例如,如何使用strace/gdb或任何其他工具调试它?

我编写了一个调用chroot的最小python脚本,与构建系统调用它的方式相同,然后运行
strace-f-v script.py

这让我发现问题是一个失败的系统调用
getdents
,在谷歌搜索了一段时间后,我发现这是一个glibc/内核错误,与getdents返回64位值有关(对于ext4系统,即使目录中只有几个文件,getdents也可以返回非常高的值,因为该值是散列),但调用者需要一个32位的值:


另请参见

中的答案是否解决了您的问题?如果是,我将此作为副本关闭。如果不是,请清楚地解释您的问题,使其与其他问题区分开来。因此,您建议“strace test-e/tmp/linux*deb”?我真的看不出链接的问题有什么帮助,你能说得更具体些吗?如果我没有弄错你的意图,你想检查glob扩展是否成功?是什么原因导致错误在一种情况下发生,而不是在另一种情况下发生?你检查过两种情况下包含/tmp的文件系统的大小吗?@Philippe我认为错误只是偶尔发生因为64位变量值仍然可以小到适合32位bits@Philippegetdents返回ext4文件系统的哈希值(这是由于历史原因造成的黑客攻击),文件系统的大小不是这里的问题。如果哈希可以用32位表示,则通配符扩展成功;如果哈希的值不能用32位表示,则getdents返回EOVERFLOW,且通配符扩展失败。