2010-01-04 4 views
8

В чем разница между test -L filename и test -h filename в оболочке ksh. С man-страницы оба были использованы для идентификации символической ссылки, но я хочу знать точную разницу.Разница между тестом -h и тестом -L

Описание приведено на странице руководства.

-h file     True if file exists and is a sym- 
         bolic link. 
-L file     True if file exists and is a sym- 
         bolic link. 

ответ

15

Исходный код ksh93, в файле bltins/test.c, показывает, что эти два варианта рассматриваются точно так же, для надежд автора на будущее, кроме:

 case 'L': 
     case 'h': /* undocumented, and hopefully will disappear */ 
      if(*arg==0 || arg[strlen(arg)-1]=='/' || lstat(arg,&statb)<0) 
        return(0); 
      return(S_ISLNK(statb.st_mode)); 

Из этого я заключаю, что они ведут себя точно то, что -h является устаревшим вариантом и может однажды исчезнуть :-)

+1

Я ценю способ ответить на мой вопрос. –

7

Похоже, что они оба существуют по наследству, чтобы быть совместимыми между различными версиями Unix. Вы должны иметь возможность использовать один из них, поскольку они делают то же самое, но имейте в виду, что если система, в которой вы работаете, не соответствует последним стандартам, она может отсутствовать.

Обе формы присутствуют в Single Unix Specification version 3/POSIX 2004, без оговорок:

-h   путь
Правда, если путь решает в файл, который существует и является символической ссылкой , False, если имя пути не может быть разрешено или , если путь разрешает файл, который существует, но не является символической ссылкой. Если конечный компонент путь является символической ссылкой , эта символьная ссылка не соблюдается.
-L   путь
Правда, если путь решает в файл, который существует и является символической ссылкой. False, если имя пути не может быть разрешено или , если путь разрешает файл, который существует, но не является символической ссылкой. Если конечный компонент путь является символической ссылкой , эта символьная ссылка не соблюдается.

Согласно странице test(1) людей на Mac OS X и FreeBSD (обратите внимание, что это предупреждение может быть устаревшим, она first appeared in NetBSD in 1996):

 
    -h file  True if file exists and is a symbolic link. This operator 
        is retained for compatibility with previous versions of 
        this program. Do not rely on its existence; use -L instead. 

И судя по всему, some versions of Solaris test поддерживают только -h и (обратно 2003) some software has switched to -h по соображениям совместимости, поэтому -h действительно может быть вашим лучшим выбором.

+0

'Не полагайтесь на его существование; используйте -L вместо этого. Это написано на странице руководства. –

+1

Да, я процитировал прямо с man-страницы в своем ответе, чтобы указать на это. –

+0

Обратите внимание, что после некоторых дальнейших исследований эта строка на странице 'man' довольно старая и может быть устаревшей. –

1

страница человек Fedora говорит

-h FILE 
      FILE exists and is a symbolic link (same as -L) 
2

Там нет никакой разницы, они точно так же. Вероятно, они существуют для объединения различных тестов pre-POSIX.