2010-01-04 28 views
8

Sự khác biệt giữa test -L filenametest -h filename trong vỏ ksh là gì. Từ trang người đàn ông, cả hai đều được sử dụng để xác định một liên kết tượng trưng, ​​nhưng tôi muốn biết sự khác biệt chính xác.Sự khác biệt giữa test -h và test -L

Đây là mô tả từ trang người đàn ông.

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

Trả lời

15

Các mã nguồn cho ksh93, trong tập tin bltins/test.c, cho thấy hai tùy chọn này được đối xử giống hệt nhau, ngoại trừ hy vọng của tác giả cho tương lai:

 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)); 

Từ đó tôi kết luận rằng chúng hoạt động chính xác giống nhau, nhưng -h là tùy chọn cũ và có thể một ngày biến mất :-)

+1

Tôi đánh giá cao cách trả lời câu hỏi của tôi. –

7

Dường như cả hai đều tồn tại vì lý do cũ, tương thích giữa các phiên bản Unix khác nhau. Bạn sẽ có thể sử dụng một trong hai, vì họ làm điều tương tự, nhưng lưu ý rằng nếu hệ thống bạn đang chạy không tuân thủ các tiêu chuẩn mới nhất, nó có thể bị thiếu một hoặc khác.

Cả hai hình thức có mặt trong Single Unix Specification version 3/POSIX 2004, không cẩn thận:

-h   tên đường dẫn
True nếu tên đường dẫn giải quyết vào một tập tin tồn tại và là một liên kết tượng trưng . Sai nếu không thể giải quyết tên đường dẫn hoặc nếu tên đường dẫn giải quyết một tệp tồn tại nhưng không phải là liên kết tượng trưng. Nếu thành phần cuối cùng của tên đường dẫn là một liên kết tượng trưng , thì liên kết tượng trưng đó sẽ không được theo sau.
-L   tên đường dẫn
True nếu tên đường dẫn giải quyết vào một tập tin tồn tại và là một liên kết tượng trưng. Sai nếu không thể giải quyết tên đường dẫn hoặc nếu tên đường dẫn giải quyết một tệp tồn tại nhưng không phải là liên kết tượng trưng. Nếu thành phần cuối cùng của tên đường dẫn là một liên kết tượng trưng , thì liên kết tượng trưng đó sẽ không được theo sau.

Theo trang test(1) người đàn ông trên Mac OS X và FreeBSD (lưu ý rằng cảnh báo này có thể là lỗi thời, nó 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. 

Và rõ ràng, some versions of Solaris test chỉ hỗ trợ -h, và (lại 2003) some software has switched to -h vì lý do tương thích, do đó, -h thực sự có thể là đặt cược tốt nhất của bạn.

+0

'Không dựa vào sự tồn tại của nó; sử dụng -L thay thế' Được viết trên trang người đàn ông –

+1

Có, tôi trích dẫn trực tiếp từ trang người đàn ông trong câu trả lời của tôi để chỉ ra điều đó. –

+0

Lưu ý rằng sau một số nghiên cứu sâu hơn, dòng đó trong trang 'man' là khá cũ và có thể đã lỗi thời. –

1

man page của Fedora nói

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

Không có sự khác biệt, chúng là giống hệt nhau. Chúng có thể tồn tại để thống nhất các thử nghiệm khác nhau triển khai trước POSIX.

Các vấn đề liên quan