为什么php的glob表现不同(不应该返回文件)?

时间:2013-06-09 12:51:25

标签: php glob

我试图将globstar添加到php,但突然间我偶然发现了这种奇怪的行为:

$ php --version
PHP 5.4.15-1~dotdeb.1 (cli) (built: May 11 2013 19:59:55)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
$ ls -p
1/  f1

$ echo *
1 f1
$ php -r 'print_r(glob("*"));'
Array
(
    [0] => 1
    [1] => f1
)

$ echo */
1/
$ php -r 'print_r(glob("*/"));'
Array
(
    [0] => 1/
)

$ echo ./*/
./1/
$ php -r 'print_r(glob("./*/"));'
Array
(
    [0] => ./1/
    [1] => ./f1
)

这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

yaccz是对的。我可以see,php的实现委托libc的glob完成所有肮脏的工作。此外,

$ cat 1.c

#include <glob.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    glob_t globbuf;
    int i;

    glob(argv[1], 0, NULL, &globbuf);
    for (i = 0; i < globbuf.gl_pathc; i++)
        printf("%s\n", globbuf.gl_pathv[i]);
    globfree(&globbuf);
    return 0;
}
$ gcc 1.c -o 1.c.out

$ ldd 1.c.out | grep libc
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5f2222d000)
$ dpkg -S /lib/x86_64-linux-gnu/libc.so.6
libc6: /lib/x86_64-linux-gnu/libc.so.6
$ dpkg -l | grep -E 'libc6[^-]'
ii  libc6                               2.13-38                      Embedded GNU C Library: Shared libraries

$ ./1.c.out '*'
1
f1

$ ./1.c.out '*/'
1/

$ ./1.c.out './*/'
./1/
./f1