Яка різниця між "realpath" та "readlink -f"


68

Я багато читав про realpathкоманду та про те, як вона була принижена завдяки тому, readlink -fщо зараз рекомендується. Я також десь бачив, що причиною того, що вводився realpath, було відсутність такої функціональності в readlink і що після його введення realpath вже не потрібен, і його підтримка припинена більшістю постачальників ОС.

Причиною мого запитання є те, що я також бачив, як багато людей рекомендують readlink -fкоманду "майже подібну" realpath, і саме це мене турбує, тому що ніхто не деталізує цю "досить схожу" частину. Які фактичні відмінності?

Відповіді:


73

Навколо є кілька realpathкоманд.

realpathУтиліта є оболонкою навколо realpathбібліотеки функцій і була заново багато разів .

Debian використовує для підтримки realpathпакета ( відокремленого від dwwwтак деревного ) , який не змінився , за винятком щодо упаковки і документації з 2001 року, але в даний час припинено. Ця утиліта була застаріла, оскільки зараз є більше стандартних альтернатив (GNU readlinkі незабаром GNU realpath), але в той час у GNU утиліти взагалі не було readlink. Ця реалізація realpathпідтримує декілька optionsдля запобігання символічної роздільної здатності посилань або отримання результату з нульовим завершенням. BusyBox також включає власну realpathкоманду (яка не приймає жодних варіантів).

GNU coreutils представив realpathкоманду у версії 8.15 у січні 2012 року. Це сумісна заміна для BusyBox і Debian realpath, а також має багато спільних варіантів з GNU readlink.

realpathмає такий же ефект, як і readlink -fу GNU readlink. Що відрізняє дві команди (а точніше різні realpathкоманди від readlink -f) - це додаткові параметри, які вони підтримують.

GNU realpathне застаріло; у нього є протилежна проблема: це занадто нове, щоб бути доступним скрізь. Debian використовував, щоб опустити GNUrealpath зі свого coreutilsпакету і дотримуватися свого realpath. Я не знаю чому, оскільки GNU realpathмає бути заміною. Щодо Debian jessie та Ubuntu 16.04, однак, GNU realpathвикористовується.

На даний момент в системах Linux найкраще канонізувати шлях, який може містити символічні посилання readlink -f.

Системи BSD мають readlinkкоманду з різними можливостями від GNU readlink. Зокрема, BSD readlinkне має можливості канонізувати шляхи, він лише проходить передану до нього симпосилання.

readlink, до речі, мала таку ж проблему - вона також була винайдена багато разів (не додавання цієї утиліти, коли символічні посилання були додані до Unix, було жалючим упущенням). Зараз він стабілізувався в декількох реалізаціях з багатьма несумісними прапорами (зокрема, BSD vs. GNU).


8
readlink -fбув у OpenBSD задовго до GNU. Усі NetBSD, FreeBSD і OpenBSD зараз є readlink -f(ваше посилання навіть згадує про це). realpathбув у FreeBSD та IRIX вже давно (не знаю, чи був він раніше у Debian). HPUX і IRIX також мають readlink, хоча і ні -f. realpathПакет в Debian експериментальної тепер один з Coreutils ( в якості експерименту , щоб побачити , якщо він ламає речі). Тим realpathбільше не подобається, readlink -eколи GNU схожий, readlink -fтак що це не повна заміна
краплі

2
realpathбула в FreeBSD з 2002 року До цього, pwdробить це (починаючи з 2000 року, pwd some-fileназвали б realpath()на file). Debian мав realpathпакет з 1996 роком один на IRIX , ймовірно , що передує його , хоча я не знайшов ніяких інших доказів , ніж це було в IRIX 6.5 в 1998 році OpenBSD купоросу додалося -fдо readlink 1997 року . GNU додав readlinkу 2003 році, і це було -fз самого початку.
Стефан Шазелас

2
Відмінна резюме спасибі Зауважте, що краща помилка для запиту переходу debian на варіант GNU - це bugs.debian.org/730779 Навіть існуючий сервіс реального шляху хоче, щоб комутатор стався
Pádraig Brady,

1
Дивовижна відповідь. Відсутні лише посилання на реалізацію RHEL realpath. Хтось знає, чи вона якось відрізняється від readlink -fверсії?
Феліпе Леоо

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

Доступність

readlinkвстановлюється в межах більшості дистрибутивів Linux. Беручи до уваги, вони realpathповинні бути чітко встановлені.

Підводячи підсумок

Якщо ви хочете замінити дзвінки, realpath ...то використовуйте readlink -e ....


Тестовано за допомогою readlink (GNU coreutils) 8.21 та realpath версії 1.19 на Ubuntu 16.

( Ред. @AnthonyGeoghegan писав " це стосується версії Debian realpath. Версія GNU realpathповодиться так само, якreadlink -f ")


3
Я підтримав цю відповідь, але пропоную уточнити, що це стосується версії Debian realpath. Версія GNU realpathповодиться так само, як і readlink -f.
Ентоні Геогеган

2
Можна підтвердити, що це не працює на MacOS High Sierra.
Pred
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.