为什么使用php';s glob的行为不同(不应该返回文件时返回文件)?
我试图将globstar添加到php中,但突然发现了这种奇怪的行为:为什么使用php';s glob的行为不同(不应该返回文件时返回文件)?,php,glob,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 'p
$ 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
)
这是一个错误吗?亚茨是对的。正如我所能做的,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
$cat 1.c
#包括
#包括
int main(int argc,char*argv[])
{
glob_t globbuf;
int i;
glob(argv[1],0,NULL,&globbuf);
对于(i=0;i/lib/x86_64-linux-gnu/libc.so.6(0x00007F5F22220000)
$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嵌入式GNU C库:共享库
美元/1.c.出'*'
1.
f1
美元/1.c.输出'*/'
1/
美元/1.c.输出“/*/”
./1/
./f1
有用于过滤的GLOB_ONLYDIR
。尾随的/
斜杠没有文档上的意义,我想说的是,它在占位符之后作为纯基名分隔符被忽略了。@mario你应该回答这个问题。我敢打赌这是直接来自libc的。不管怎么说,PHP就是PHP。如果尾斜杠一直被忽略,那也没关系。但事实并非如此。这个问题似乎离题了,因为它是关于一个潜在的bug,应该在项目的bug跟踪器中询问。