Разница между тестом -h и test -L

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

Вот описание с man-страницы.

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

Ответ 1

Исходный код 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 является устаревшим вариантом и может однажды исчезнуть: -)

Ответ 2

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

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

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

В соответствии с man-страницей test(1) в Mac OS X и FreeBSD (обратите внимание, что это предупреждение может быть устаревшим; href= "http://cvsweb.netbsd.org/bsdweb.cgi/src/bin/test/test.1.diff?r1=1.6&r2=1.7&only_with_tag=MAIN&f=h" rel= "noreferrer" > впервые появился в NetBSD в 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.

И, по-видимому, некоторые версии Solaris test поддерживают только -h и (еще в 2003 году) какое-то программное обеспечение переключилось на -h по соображениям совместимости, поэтому -h может быть вашим лучшим выбором.

Ответ 3

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

Ответ 4

На странице руководства Fedora

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