我有一种情况,bash的通配符扩展有时似乎在我的自动构建中不起作用(这与这个问题类似,整个过程都在docker容器中创建的chroot中运行,所以可能有很多原因导致它被破坏(损坏的libc、损坏的shell等(,但这个结果并不能帮助我分析这个问题。
工作案例的第一行显示了扩展的文件名:
$ 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/kernel错误,与getdents返回64位值有关(对于ext4系统,即使目录中只有几个文件,getdents也可以返回非常高的值,因为该值是一个哈希值(,但调用方期望32位值:https://bugzilla.kernel.org/show_bug.cgi?id=205957
另请参阅https://unix.stackexchange.com/questions/528361/dash-not-expanding-glob-wildcards-in-chroot