Между чем различие test -L filename
и test -h filename
в оболочке ksh. Из страницы справочника оба использовались для идентификации символьной ссылки, но я хочу знать точное различие.
Вот описание из страницы справочника.
-h file True if file exists and is a sym-
bolic link.
-L file True if file exists and is a sym-
bolic link.
] Исходный код для []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[
] является наследственным вариантом и может однажды исчезнуть :-)[
Похоже, что они оба существуют по наследственным причинам, чтобы быть совместимыми между различными версиями Unix. Вы должны быть в состоянии использовать любую из них, так как они делают одно и то же, но имейте в виду, что если система, на которой вы работаете, не соответствует последним стандартам, то может отсутствовать та или иная.
Обе формы присутствуют в Single Unix Specification version 3/POSIX 2004, без каких-либо оговорок:
-h pathname True if pathname разрешается в файл, который существует и является символической ссылкой. Ложно, если отчество не может быть разрешено, или если pathname разрешается в файл, который существует, но не является символической ссылкой. Если конечным компонентом pathname является symlink, эта символическая ссылка не отслеживается. -L pathname True, если pathname разрешается в файл, который существует и является символической ссылкой. Ложно, если -L не может быть разрешен, или если pathname разрешается в файл, который существует, но не является символической ссылкой. Если конечным компонентом pathname является Симлинк, эта симлинк не отслеживается.
Согласно test(1)
man page на Mac OS X и FreeBSD (обратите внимание, что это предупреждение может быть устаревшим; оно впервые появилось в 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
, на самом деле, может быть лучшим вариантом для вас.
Разницы нет, они точно такие же. Вероятно, они существуют для объединения различных реализаций test pre-POSIX.
.Man page Fedora's says
-h FILE
FILE exists and is a symbolic link (same as -L)