Qual è la differenza tra "realpath" e "readlink -f"


68

Ho letto molto sul realpathcomando e su come è stato deprecato con l' readlink -fessere ora consigliato. Ho anche visto in alcuni punti che il motivo per cui è stato introdotto realpath era la mancanza di tale funzionalità nel readlink e che una volta introdotto, realpath non era più necessario e il suo supporto è stato interrotto dalla maggior parte dei fornitori di sistemi operativi.

Il motivo della mia domanda è che ho anche visto molte persone raccomandare readlink -fcome un comando "abbastanza simile" realpath, ed è quello che mi dà fastidio, perché nessuno elabora quella parte "praticamente simile". Quali sono le differenze effettive?

Risposte:


73

Ci sono diversi realpathcomandi in giro.

L' realpathutilità è un wrapper per le realpathfunzioni della libreria ed è stata reinventata molte volte .

Debian era solita mantenere un realpathpacchetto ( separato da dwwwda woody ) che non è cambiato se non per quanto riguarda l'imballaggio e la documentazione dal 2001, ma ora è stato gradualmente eliminato. Questa utility è stata deprecata perché ora ci sono più alternative standard (GNU readlinke presto GNU realpath), ma al momento le utility GNU non lo avevano nemmeno readlink. Questa implementazione di realpathsupporta alcuni optionsper impedire la risoluzione del collegamento simbolico o produrre output con terminazione null. BusyBox include anche il proprio realpathcomando (che non richiede opzioni).

I coreutils di GNU hanno introdotto un realpathcomando nella versione 8.15 nel gennaio 2012. Questo è un sostituto compatibile per BusyBox e Debian realpathe ha anche molte opzioni in comune con GNU readlink.

realpathha lo stesso effetto readlink -fdi GNU readlink. Ciò che distingue i due comandi (o piuttosto i vari realpathcomandi da readlink -f) sono le opzioni extra che supportano.

GNU realpathnon è deprecato; ha il problema opposto: è troppo nuovo per essere disponibile ovunque. Debian ometteva GNUrealpath dal suo coreutilspacchetto e si atteneva al suo realpath. Non so perché, dal momento che GNU realpathdovrebbe essere un sostituto drop-in. A partire da Debian jessie e Ubuntu 16.04, tuttavia, realpathviene utilizzato GNU .

Sui sistemi Linux, al momento, la soluzione migliore per canonicalizzare un percorso che può contenere collegamenti simbolici è readlink -f.

I sistemi BSD hanno un readlinkcomando, con capacità diverse da GNU readlink. In particolare, BSD readlinknon ha un'opzione per canonicalizzare i percorsi, attraversa solo il collegamento simbolico ad esso passato.

readlink, per inciso, ha avuto lo stesso problema - è stato anche inventato molte volte (non aggiungere questa utilità quando sono stati aggiunti collegamenti simbolici a Unix è stata una deplorevole omissione). Si è ora stabilizzato in diverse implementazioni con molti flag incompatibili (in particolare BSD vs. GNU).


8
readlink -fera in OpenBSD molto prima di GNU. Tutti NetBSD, FreeBSD e OpenBSD ora hanno readlink -f(anche il tuo link lo menziona). realpathè in FreeBSD e IRIX da molto tempo (non so se è precedente a quello in Debian). Anche HPUX e IRIX hanno readlink, sebbene non lo siano -f. Il realpathpacchetto in Debian sperimentale è ora quello di coreutils (come esperimento per vedere se rompe le cose). Il dwww si realpathcomporta in modo più simile a readlink -equello GNU, readlink -fquindi non è un rimpiazzo completo
Stéphane Chazelas,

2
realpathè stato in FreeBSD dal 2002. Prima di allora, pwdstava facendo (a partire dal 2000, pwd some-fileavrebbe chiamato realpath()su file). Debian ha avuto un realpathpacchetto dal 1996. Quello a IRIX probabilmente precede, però ho trovato alcuna prova diverso da quello che era in IRIX 6.5 nel 1998. OpenBSD ha aggiunto un -fa readlink nel 1997 . GNU ha aggiunto readlinknel 2003 e aveva -fdall'inizio.
Stéphane Chazelas,

2
Eccellente sintesi grazie. Nota che un bug migliore per la richiesta a debian di passare alla variante GNU è bugs.debian.org/730779 Anche il manutentore del realpath esistente vuole che avvenga il passaggio
Pádraig Brady,

1
Risposta fantastica. Mancati solo riferimenti all'implementazione RHEL di realpath. Qualcuno sa se è in qualche modo diverso dalla readlink -fversione?
Felipe Leão,

1
@ StéphaneChazelas Oh wow, molti errori nelle mie risposte davvero. Grazie per averli segnalati. Potresti pubblicare una risposta corretta e cancellerò la mia? (Altrimenti, correggerò gli errori, ma è più lavoro da approfondire sulla mia lunga lista di cose da fare ...)
Gilles 'SO- smetti di essere malvagio'

17

tl; dr readlink -f restituirà 0per un file inesistente in una directory esistente mentre realpathrestituisce 1. Tuttavia, readlink -esi comporterà come realpathe ritornerà 1per un file inesistente (vedere la nota dei redattori alla fine).

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 con directory inesistente

readlink -f il comportamento varia a seconda di quale parte del percorso non esiste.

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

availablity

readlinkè installato nella maggior parte delle distribuzioni Linux. Considerando che, realpathspesso deve essere installato esplicitamente.

In sintesi

Se si desidera sostituire le chiamate da realpath ...utilizzare readlink -e ....


Testato con readlink (GNU coreutils) 8.21 e realpath versione 1.19 su Ubuntu 16.

( Ed .: @AnthonyGeoghegan ha scritto " questo si riferisce alla versione Debian di realpath. La versione GNU di realpathsi comporta comereadlink -f ")


3
Ho votato a favore di questa risposta ma suggerirei di chiarire che si riferisce alla versione di Debian di realpath. La versione GNU di realpathsi comporta come readlink -f.
Anthony G - giustizia per Monica,

2
Può confermare che questo non funziona su MacOS High Sierra.
Pred
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.