我有一个情况,在我的自动构建中,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
两次
我怎么能用stracegdb或者其他工具来调试呢?
我写了一个最小的python脚本,以我的编译系统的方式调用chroot,然后运行 strace -f -v script.py
这让我发现,问题是系统调用失败。getdents
,在上网查了一下,发现这是一个glibckernel的bug,与getdents返回一个64位的值有关(对于ext4系统来说,getdents可以返回非常高的值,即使目录中只有几个文件,因为这个值是一个哈希值),但调用者期望的是一个32位的值。https:/bugzilla.kernel.orgshow_bug.cgi?id=205957。
另见 https:/unix.stackexchange.comquestions528361dash-not-expanding-glob-wildcards-in-chroot。