在ksh shell中test -L filename
和test -h filename
有什麼區別?在手冊頁中,兩者都用於標識符號鏈接,但我想知道確切的區別。測試-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.
在ksh shell中test -L filename
和test -h filename
有什麼區別?在手冊頁中,兩者都用於標識符號鏈接,但我想知道確切的區別。測試-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.
爲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 路徑 真要是 路徑解析爲存在且是一個符號鏈接文件。假若 路徑名稱無法解析,或者 如果 路徑名稱解析爲存在但不是符號鏈接的文件。如果 路徑名的最終組件是符號鏈接 ,則不會遵循該符號鏈接。 -L 路徑 真要是 路徑解析爲存在且是一個符號鏈接的文件。假若 路徑名稱無法解析,或者 如果 路徑名稱解析爲存在但不是符號鏈接的文件。如果 路徑名的最終組件是符號鏈接 ,則不會遵循該符號鏈接。
據對Mac OS X和FreeBSD的test(1)
手冊頁(注意這個警告可能是過時的,它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
可能實際上是你最好的選擇。
'不要依賴它的存在;使用-L而不是'是否寫在手冊頁 – 2010-01-04 05:45:53
是的,我在我的答案中直接引用了man page,以便指出。 – 2010-01-04 05:49:48
請注意,經過一些進一步的研究後,「man」頁面中的該行很舊,並且可能已過時。 – 2010-01-04 06:18:12
Fedora的手冊頁說
-h FILE
FILE exists and is a symbolic link (same as -L)
沒有區別,它們是完全一樣的。他們可能存在統一不同的測試執行pre-POSIX。
我很欣賞回答我的問題的方式。 – 2010-01-04 09:42:26