Có gì khác biệt giữa những người thực sự khác


68

Tôi đã đọc rất nhiều về realpathlệnh và làm thế nào nó đã bị phản đối với hiện readlink -fđang được khuyến nghị. Tôi cũng đã thấy ở một số nơi rằng lý do tại sao realpath được giới thiệu là do thiếu chức năng như vậy trong readlink và rằng một khi nó đã được giới thiệu, realpath không còn cần thiết nữa và hầu hết các nhà cung cấp hệ điều hành đã ngừng hỗ trợ.

Lý do cho câu hỏi của tôi là tôi cũng đã thấy nhiều người đề xuất readlink -fnhư một lệnh "khá giống nhau" realpathvà đó là điều khiến tôi bận tâm, bởi vì không ai giải thích về phần "khá giống nhau" đó. Sự khác biệt thực tế là gì?

Câu trả lời:


73

Có một số realpathlệnh xung quanh.

Các realpathtiện ích là một wrapper quanh realpathchức năng thư viện và đã được tái phát minh nhiều lần .

Debian sử dụng để duy trì một realpathgói ( tách ra từ dwwwtừ gỗ ) mà vẫn không thay đổi, ngoại trừ liên quan đến bao bì và tài liệu từ năm 2001, nhưng hiện đã được loại bỏ. Tiện ích này không được chấp nhận vì hiện nay có nhiều lựa chọn thay thế tiêu chuẩn hơn (GNU readlinkvà GNU sớm realpath), nhưng tại thời điểm đó, các tiện ích GNU thậm chí không có readlink. Việc triển khai này realpathhỗ trợ một số optionsđể ngăn chặn độ phân giải liên kết tượng trưng hoặc tạo đầu ra kết thúc null. BusyBox cũng bao gồm realpathlệnh riêng của nó (không có tùy chọn).

GNU coreutils đã giới thiệu một realpathlệnh trong phiên bản 8.15 vào tháng 1 năm 2012. Đây là một sự thay thế tương thích cho BusyBox và Debian realpath, và cũng có nhiều tùy chọn chung với GNU readlink.

realpathcó tác dụng tương tự như readlink -fvới GNU readlink. Điều phân biệt hai lệnh (hay đúng hơn là các realpathlệnh khác nhau readlink -f) là các tùy chọn bổ sung mà chúng hỗ trợ.

GNU realpathkhông bị phản đối; nó có một vấn đề ngược lại: nó quá mới để có mặt ở mọi nơi. Debian đã sử dụng để loại bỏ GNUrealpath khỏi coreutilsgói của nó và tự gắn bó với nó realpath. Tôi không biết tại sao, vì GNU realpathphải là một sự thay thế thả vào. Tuy nhiên, kể từ Debian jessie và Ubuntu 16.04, GNU realpathđược sử dụng.

Trên các hệ thống Linux, tại thời điểm này, đặt cược tốt nhất của bạn để hợp thức hóa một đường dẫn có thể chứa các liên kết tượng trưng là readlink -f.

Các hệ thống BSD có một readlinklệnh, với các khả năng khác nhau từ GNU readlink. Cụ thể, BSD readlinkkhông có tùy chọn để chuẩn hóa các đường dẫn, nó chỉ đi qua liên kết tượng trưng được truyền tới nó.

readlink, tình cờ, có cùng một vấn đề - nó cũng được phát minh nhiều lần (không thêm tiện ích này khi các liên kết tượng trưng được thêm vào Unix là một thiếu sót đáng tiếc). Hiện tại nó đã ổn định trong một số triển khai với nhiều cờ không tương thích (cụ thể là BSD so với GNU).


8
readlink -fđã ở OpenBSD từ lâu trước GNU. Tất cả NetBSD, FreeBSD và OpenBSD hiện có readlink -f( liên kết của bạn thậm chí đề cập đến nó). realpathđã có trong FreeBSD và IRIX trong một thời gian dài (không biết liệu nó có trước phiên bản Debian không). HPUX và IRIX cũng có readlink, mặc dù không -f. Các realpathgói trong thực nghiệm Debian bây giờ là một từ coreutils (như là một thử nghiệm để xem nếu nó phá vỡ mọi thứ). Dwww realpathhoạt động giống như readlink -etrong khi GNU giống như readlink -fvậy, nó không phải là một thay thế hoàn toàn
Stéphane Chazelas

2
realpathđã ở FreeBSD từ năm 2002. Trước đó, pwdđã làm điều đó (từ năm 2000, pwd some-filesẽ tiếp realpath()tục file). Debian đã có một realpathgói từ năm 1996. Một trong những trên IRIX lẽ xảy ra trước đó mặc dù tôi không tìm thấy bằng chứng khác hơn là nó được trong IRIX 6,5 vào năm 1998. OpenBSD thêm một -fđến readlink năm 1997 . GNU đã thêm readlinkvào năm 2003 và nó đã có -ftừ đầu.
Stéphane Chazelas

2
Tóm tắt tuyệt vời cảm ơn. Lưu ý một lỗi tốt hơn cho yêu cầu debian chuyển sang biến thể GNU là bug.debian.org/730779 Ngay cả người duy trì giao diện hiện tại muốn chuyển đổi xảy ra
Pádraig Brady

1
Câu trả lời tuyệt vời. Chỉ thiếu các tài liệu tham khảo để thực hiện RHEL realpath. Có ai biết nếu nó là một cái gì đó khác với readlink -fphiên bản?
Felipe Leão

1
@ StéphaneChazelas Oh wow, rất nhiều lỗi trong câu trả lời của tôi thực sự. Cảm ơn đã chỉ ra chúng. Bạn có thể gửi một câu trả lời chính xác, và tôi sẽ xóa của tôi? (Nếu không, tôi sẽ sửa các lỗi, nhưng sẽ hiệu quả hơn khi xử lý danh sách việc cần làm lâu dài của tôi)
Gilles

17

tl; dr readlink -f sẽ trả về 0một tệp không tồn tại trong một thư mục hiện có trong khi realpathtrả về 1. Tuy nhiên, readlink -esẽ hành xử như realpathvà trả lại 1cho một tệp không tồn tại (xem ghi chú của Biên tập viên ở cuối).

readlink -f

$ readlink -f non-existent-file
/home/user/non-existent-file
$ echo $?
0

readlink -e

$ readlink -e non-existent-file
$ echo $?
1

realpath

$ realpath non-existent-file
non-existent-file: No such file or directory
$ echo $?
1

readlink -f với thư mục không tồn tại

readlink -f hành vi khác nhau tùy thuộc vào phần nào của đường dẫn không tồn tại.

$ readlink -f /tmp/non-existent-dir/foo
$ echo $?
1

Sẵn có

readlinkđược cài đặt trong hầu hết các bản phân phối Linux. Trong khi đó, realpaththường phải được cài đặt rõ ràng.

Tóm tắt

Nếu bạn muốn thay thế cuộc gọi để realpath ...sử dụng readlink -e ....


Đã thử nghiệm với readlink (GNU coreutils) 8.21phiên bản realpath 1.19 trên Ubuntu 16.

( Ed.: @AnthonyGeoghegan đã viết " điều này đề cập đến phiên bản Debian của realpath. Phiên bản GNU realpathhoạt động giống nhưreadlink -f ")


3
Tôi đã đưa ra câu trả lời này nhưng tôi khuyên bạn nên làm rõ rằng điều này đề cập đến phiên bản Debian của realpath. Phiên bản GNU realpathhành xử giống như readlink -f.
Anthony G - công lý cho Monica

2
Có thể xác nhận rằng điều này không hoạt động trên MacOS High Sierra.
Pred
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.