อะไรคือความแตกต่างระหว่าง "realpath" และ "readlink -f"


68

ฉันอ่านมากเกี่ยวกับrealpathคำสั่งและวิธีการเลิกใช้กับreadlink -fการแนะนำในขณะนี้ ฉันเคยเห็นมาแล้วในบางสถานที่ว่าเหตุผลที่แนะนำ realpath นั้นเกิดจากการขาดฟังก์ชั่นดังกล่าวใน readlink และเมื่อมีการแนะนำ realpath ก็ไม่จำเป็นต้องใช้ realpath อีกต่อไป

เหตุผลสำหรับคำถามของฉันคือฉันยังเห็นคนจำนวนมากแนะนำreadlink -fว่าเป็นคำสั่ง "คล้ายกันมาก" realpathและนั่นคือสิ่งที่รบกวนฉันเพราะไม่มีใครอธิบายเกี่ยวกับส่วนที่ "คล้ายกันมาก" ความแตกต่างที่แท้จริงคืออะไร?

คำตอบ:


73

มีหลายrealpathคำสั่งอยู่รอบ ๆ

realpathยูทิลิตี้เป็นเสื้อคลุมรอบrealpathการทำงานห้องสมุดและได้รับนวัตกรรมใหม่หลายครั้ง

Debian ใช้ในการรักษาrealpathแพคเกจ ( แยกออกจากdwwwตั้งแต่วู้ดดี้ ) ซึ่งไม่ได้เปลี่ยนยกเว้นเกี่ยวกับการบรรจุภัณฑ์และเอกสารตั้งแต่ปี 2001 แต่ตอนนี้ได้รับการค่อย ๆ ออกมา ยูทิลิตี้นี้เลิกใช้แล้วเนื่องจากขณะนี้มีทางเลือกมาตรฐานมากขึ้น (GNU readlinkและอีกไม่นาน GNU realpath) แต่ในขณะนี้ยูทิลิตี้ GNU ไม่ได้มีreadlinkเลย การนำไปใช้งานของการrealpathสนับสนุนบางอย่างoptionsเพื่อป้องกันการแก้ไขการเชื่อมโยงสัญลักษณ์หรือสร้างเอาต์พุตที่สิ้นสุดด้วยค่า null BusyBoxยังมีrealpathคำสั่งของตัวเอง(ซึ่งไม่มีตัวเลือก)

coreutils GNUแนะนำrealpathคำสั่งในรุ่น 8.15ในเดือนมกราคม 2012 นี้เป็นทดแทนที่รองรับสำหรับ BusyBox และ Debian ของrealpathและยังมีตัวเลือกมากมายในการร่วมกันกับ readlinkGNU

realpathมีผลเช่นเดียวreadlink -fกับ readlinkGNU สิ่งที่แยกความแตกต่างระหว่างสองคำสั่ง (หรือมากกว่าrealpathคำสั่งต่าง ๆreadlink -f) เป็นตัวเลือกพิเศษที่สนับสนุน

GNU realpathไม่ได้ถูกปฏิเสธ มันมีปัญหาตรงข้าม: มันใหม่เกินไปที่จะสามารถใช้ได้ทุกที่ Debian ใช้ในการละเว้น GNUrealpathจากของแพคเกจและติดกับตัวของมันเองcoreutils realpathฉันไม่รู้ว่าทำไมเนื่องจาก GNU realpathควรเป็นแบบดรอปดาวน์ อย่างไรก็ตามสำหรับ Debian jessie และ Ubuntu 16.04 realpathนั้นใช้GNU

บนระบบลินุกซ์ในขณะนี้ทางออกที่ดีที่สุดของคุณเพื่อ canonicalize readlink -fเส้นทางที่อาจมีการเชื่อมโยงสัญลักษณ์เป็น

ระบบ BSD มีreadlinkคำสั่งที่มีความสามารถที่แตกต่างจาก readlinkGNU โดยเฉพาะอย่างยิ่ง BSD readlinkไม่มีตัวเลือกในการกำหนดเส้นทางให้เป็นมาตรฐานมันจะส่งผ่าน symlink ที่ส่งไปเท่านั้น

readlinkบังเอิญมีปัญหาเดียวกัน - มันถูกคิดค้นขึ้นหลายครั้ง (ไม่ได้เพิ่มยูทิลิตี้นี้เมื่อเพิ่มลิงก์สัญลักษณ์ที่ถูกเพิ่มไปยัง Unix เป็นการละเว้นที่น่าเสียใจ) ตอนนี้มันมีความเสถียรในการใช้งานหลายอย่างด้วยการตั้งค่าสถานะที่เข้ากันไม่ได้มากมาย (โดยเฉพาะอย่างยิ่ง BSD เทียบกับ GNU)


8
readlink -fอยู่ใน OpenBSD นานก่อน GNU ขณะนี้ NetBSD, FreeBSD และ OpenBSD ทั้งหมดมีreadlink -f( ลิงก์ของคุณยังกล่าวถึง) realpathได้รับใน FreeBSD และ IRIX เป็นเวลานาน (ไม่ทราบว่ามันมาก่อนใน Debian) HPUX และ IRIX ก็มีreadlinkเช่น-fกัน realpathแพคเกจในเดทดลองในขณะนี้คือหนึ่งจาก coreutils (ตามการทดสอบเพื่อดูว่าจะแบ่งสิ่ง) dwww realpathทำหน้าที่เหมือนกันมากreadlink -eในขณะที่ GNU ชอบreadlink -fดังนั้นจึงไม่ใช่
ตัวแทน Dropin ที่

2
realpathได้รับใน FreeBSD ตั้งแต่ปี 2002 ก่อนหน้านั้นpwdทำมัน (ตั้งแต่ปี 2000 pwd some-fileจะเรียกrealpath()บนfile) Debian มีrealpathแพคเกจตั้งแต่ปี 1996 หนึ่งใน IRIX อาจถือกำเนิดมันแม้ว่าฉันไม่พบหลักฐานอื่น ๆ กว่าก็คือใน IRIX 6.5 ในปี 1998 OpenBSD เพิ่ม-fไปในปี 1997readlink เพิ่ม GNU readlinkในปี 2003และ-fเริ่มตั้งแต่ต้น
Stéphane Chazelas

2
สรุปยอดเยี่ยมขอบคุณ หมายเหตุ: ข้อผิดพลาดที่ดีขึ้นสำหรับการร้องขอสำหรับเดเบียนเพื่อสลับไปยังตัวแปรคือ GNU bugs.debian.org/730779แม้ผู้ดูแลที่มีอยู่ realpath ต้องการสวิทช์ที่จะเกิดขึ้น
Pádraigเบรดี้

1
คำตอบที่ยอดเยี่ยม realpathที่ไม่ได้รับเพียงการอ้างอิงถึงการดำเนินงานของ RHEL ไม่มีใครรู้ว่ามันแตกต่างจากreadlink -fเวอร์ชั่นหรือไม่?
Felipe Leão

1
@ StéphaneChazelasโอ้ว้าวข้อผิดพลาดมากมายในคำตอบของฉันแน่นอน ขอบคุณที่ชี้นำพวกเขา คุณสามารถโพสต์คำตอบที่ถูกต้องและฉันจะลบของฉันได้ไหม (มิฉะนั้นผมจะแก้ไขข้อผิดพลาด แต่มันก็เป็นงานที่ต้องตรึงบนไปยังรายการสิ่งที่ต้องทำของฉันยาว ... )
กิลส์

17

TL; DR readlink -fจะกลับมา0หาไฟล์ที่ไม่มีอยู่จริงในไดเรกทอรีที่มีอยู่ในขณะที่ผลตอบแทนrealpath 1อย่างไรก็ตามreadlink -eจะทำตัวเหมือนrealpathและส่งคืน1ไฟล์ที่ไม่มีอยู่ (ดูหมายเหตุบรรณาธิการตอนท้าย)

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 กับไดเรกทอรีที่ไม่มีอยู่

readlink -f พฤติกรรมแตกต่างกันไปขึ้นอยู่กับส่วนของเส้นทางที่ไม่มี

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

availablity

readlinkถูกติดตั้งภายในลีนุกซ์ส่วนใหญ่ ในขณะที่realpathมักจะต้องติดตั้งอย่างชัดเจน

สรุป

หากคุณต้องการที่จะเปลี่ยนการโทรไปแล้วใช้realpath ...readlink -e ...


ทดสอบกับreadlink (GNU coreutils) 8.21และrealpath เวอร์ชัน 1.19บน Ubuntu 16

( Ed .: @AnthonyGeoghegan เขียนว่า " นี่หมายถึงรุ่น Debian ของrealpathรุ่น GNU ของrealpathพฤติกรรมเช่นเดียวกับreadlink -f ")


3
ฉัน upvoted คำตอบนี้ realpathแต่ผมขอแนะนำให้ชัดเจนว่านี้หมายถึงรุ่นของ รุ่น GNU ของพฤติกรรมเช่นเดียวกับrealpath readlink -f
Anthony G - ความยุติธรรมสำหรับโมนิก้า

2
สามารถยืนยันได้ว่าสิ่งนี้ไม่ทำงานบน MacOS High Sierra
Pred
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.