Was ist der Unterschied zwischen "realpath" und "readlink -f"

68

Ich habe viel über das realpathKommando gelesen und wie es veraltet ist, readlink -fweil es jetzt empfohlen wird. Ich habe auch an einigen Stellen gesehen, dass der Grund für die Einführung von RealPath das Fehlen solcher Funktionen in ReadLink war und dass RealPath nach seiner Einführung nicht mehr benötigt wurde und die Unterstützung von den meisten Betriebssystemherstellern eingestellt wurde.

Der Grund für meine Frage ist, dass ich auch viele Leute gesehen habe, die readlink -fals Befehl "ziemlich ähnlich" empfahlen realpath, und das ist es, was mich stört, weil niemand auf diesen "ziemlich ähnlichen" Teil näher eingeht. Was sind die tatsächlichen Unterschiede?

Felipe Leão
quelle

Antworten:

73

Es gibt verschiedene realpathBefehle.

Das realpathDienstprogramm ist ein Wrapper um die realpathBibliotheksfunktionen und wurde viele Male neu erfunden .

Debian verwendet , um ein erhalten realpathPaket ( getrennt von dwwwda holzig ) , die außer in Bezug auf Verpackung und Dokumentation seit 2001 nicht geändert hat, sondern wurde nun auslaufen. Dieses Hilfsprogramm war veraltet, weil es jetzt mehr Standardalternativen (GNU readlinkund bald GNU realpath) gibt, aber zu der Zeit hatten die GNU-Hilfsprogramme überhaupt keine readlink. Diese Implementierung realpathunterstützt einige options, um die Auflösung symbolischer Links zu verhindern oder eine nullterminierte Ausgabe zu erzeugen. BusyBox enthält auch einen eigenen realpathBefehl (der keine Option verwendet).

GNU coreutils hat im Januar 2012 einen realpathBefehl in Version 8.15 eingeführt . Dies ist ein kompatibler Ersatz für BusyBox und Debian realpathund hat auch viele Optionen gemeinsam mit GNU readlink.

realpathhat den gleichen Effekt wie readlink -fbei GNU readlink. Was die beiden Befehle (oder vielmehr die verschiedenen realpathBefehle readlink -f) unterscheidet, sind die zusätzlichen Optionen, die sie unterstützen.

GNU realpathist nicht veraltet; es hat das gegenteilige problem: es ist zu neu, um überall verfügbar zu sein. Debian ließ GNUrealpath aus seinem coreutilsPaket aus und blieb bei seinem eigenen realpath. Ich weiß nicht warum, da GNU realpathein Ersatz sein sollte. Ab Debian Jessie und Ubuntu 16.04 wird jedoch GNU realpathverwendet.

Auf Linux-Systemen empfiehlt es sich derzeit, einen Pfad zu kanonisieren, der möglicherweise symbolische Links enthält readlink -f.

BSD-Systeme haben einen readlinkBefehl mit anderen Fähigkeiten als GNU readlink. Insbesondere hat BSD readlinkkeine Möglichkeit, Pfade zu kanonisieren, sondern durchläuft nur den ihm übergebenen Symlink.

readlinkÜbrigens hatte das gleiche Problem - es wurde auch viele Male erfunden (dieses Dienstprogramm nicht hinzuzufügen, als symbolische Links zu Unix hinzugefügt wurden, war eine bedauerliche Auslassung). Es hat sich jetzt in mehreren Implementierungen mit vielen inkompatiblen Flags (insbesondere BSD vs. GNU) stabilisiert.

Gilles
quelle
8
readlink -fwar lange vor GNU in OpenBSD. Alle NetBSD, FreeBSD und OpenBSD haben jetzt readlink -f(Ihr Link erwähnt es sogar). realpathwar lange Zeit in FreeBSD und IRIX (weiß nicht, ob es älter ist als das in Debian). HPUX und IRIX haben es auch readlink, wenn auch nicht -f. Das realpathPaket in Debian experimental ist jetzt das von coreutils (als Experiment, um zu sehen, ob es etwas kaputt macht). Das dwww verhält sich realpatheher wie readlink -edas GNU readlink -f, es ist also kein vollständiger Ersatz
Stéphane Chazelas
2
realpathSeit dem Jahr 2002 , dass in FreeBSD gewesen Vorher pwdtat es (seit 2000, pwd some-filenennen würde realpath()auf file). Debian hat eine hat realpathPaket seit 1996. Die auf IRIX wahrscheinlich früher obwohl ich keine Beweise dafür gefunden , anders als es in IRIX betrug 6,5 im Jahr 1998. OpenBSD eine hinzugefügt , -fum readlink im Jahr 1997 . GNU readlinkwurde 2003 hinzugefügt und hatte es -fvon Anfang an.
Stéphane Chazelas
2
Ausgezeichnete Zusammenfassung danke. Einen besseren Fehler für den Antrag auf debian Hinweis auf die GNU - Variante zu wechseln ist bugs.debian.org/730779 Auch die bestehenden realpath Maintainer der Schalter passieren wollen
Pádraig Brady
1
Geniale Antwort. Verpasste nur Verweise auf die RHEL-Implementierung von realpath. Weiß jemand, ob es sich irgendwie von der readlink -fVersion unterscheidet?
Felipe Leão
1
@ StéphaneChazelas Oh wow, viele Fehler in meinen Antworten in der Tat. Vielen Dank für den Hinweis. Könntest du eine richtige Antwort posten und ich werde meine löschen? (Ansonsten werde ich die Fehler korrigieren, aber es ist mehr Arbeit, an meiner langen ToDo-Liste festzuhalten ...)
Gilles
17

tl; dr readlink -f kehrt 0für eine nicht vorhandene Datei in einem bestehenden Verzeichnis während realpathRenditen 1. Allerdings readlink -everhält sich wie realpathund zurück 1für eine nicht vorhandene Datei (Anmerkung der Redaktion am Ende sehen).

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 mit nicht vorhandenem Verzeichnis

readlink -f Das Verhalten hängt davon ab, welcher Teil des Pfades nicht vorhanden ist.

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

Verfügbarkeit

readlinkwird in den meisten Linux-Distributionen installiert. Während realpathmuss oft explizit installiert werden.

in Summe

Wenn du Anrufe ersetzen willst, realpath ...dann benutze readlink -e ....


Getestet mit readlink (GNU coreutils) 8.21 und realpath Version 1.19 auf Ubuntu 16.

( Ed .: @AnthonyGeoghegan schrieb " dies bezieht sich auf die Debian-Version von realpath. Die GNU-Version von realpathverhält sich genauso wiereadlink -f ")

JamesThomasMoon1979
quelle
3
Ich habe diese Antwort positiv bewertet, möchte aber klarstellen, dass dies auf die Debian-Version von verweist realpath. Die GNU-Version von realpathverhält sich genauso wie readlink -f.
Anthony G - Gerechtigkeit für Monica
2
Kann bestätigen, dass dies unter MacOS High Sierra nicht funktioniert.
Pred