2013-06-09 1 views
-1

Я пытался добавить globstar в PHP, но я вдруг наткнулся на это странное поведение:Почему php glob ведет себя по-другому (возвращая файлы, когда они не должны)?

$ 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 
) 

Является ли это ошибка?

+2

Для фильтрации используется 'GLOB_ONLYDIR'. Конечная '/' косая черта не имеет документального значения, и я бы сказал, что она, как ожидается, игнорируется после заполнителей и как чистый разделитель базового имени. – mario

+0

@mario, вы должны были сделать вместо этого ответ. – Prix

+1

Держу пари, что это происходит прямо из libc. Во всяком случае, PHP является PHP. – yaccz

ответ

0

yaccz был прав. Как я могу see, реализация php доверяет glob libc, выполняя всю грязную работу. Кроме того,

$ 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 

 Смежные вопросы

  • Нет связанных вопросов^_^