2010-01-04 99 views
8

在ksh shell中test -L filenametest -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. 

回答

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

我很欣賞回答我的問題的方式。 – 2010-01-04 09:42:26

7

看起來,它們都是出於傳統原因存在,要在不同版本的Unix之間兼容。您應該可以使用任意一種,因爲它們完全相同,但請注意,如果您運行的系統不符合最新標準,則可能會丟失一個或另一個。

兩種形式都存在於Single Unix Specification version 3/POSIX 2004,沒有警告:

-h   路徑
真要是 路徑解析爲存在且是一個符號鏈接文件。假若 路徑名稱無法解析,或者 如果 路徑名稱解析爲存在但不是符號鏈接的文件。如果 路徑名的最終組件是符號鏈接 ,則不會遵循該符號鏈接。
-L   路徑
真要是 路徑解析爲存在且是一個符號鏈接的文件。假若 路徑名稱無法解析,或者 如果 路徑名稱解析爲存在但不是符號鏈接的文件。如果 路徑名的最終組件是符號鏈接 ,則不會遵循該符號鏈接。

據對Mac OS X和FreeBSDtest(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可能實際上是你最好的選擇。

+0

'不要依賴它的存在;使用-L而不是'是否寫在手冊頁 – 2010-01-04 05:45:53

+1

是的,我在我的答案中直接引用了man page,以便指出。 – 2010-01-04 05:49:48

+0

請注意,經過一些進一步的研究後,「man」頁面中的該行很舊,並且可能已過時。 – 2010-01-04 06:18:12

1

Fedora的手冊頁說

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

沒有區別,它們是完全一樣的。他們可能存在統一不同的測試執行pre-POSIX。

相關問題