Разница между тестом -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)