Existem vários realpath
comandos por aí.
O realpath
utilitário é um invólucro em torno das realpath
funções da biblioteca e foi reinventado várias vezes .
Debian usado para manter um realpath
pacote ( separados a partir dwww
desde lenhosa ), que não mudou, exceto sobre embalagens e documentação desde 2001, mas agora foi descontinuada. Este utilitário foi descontinuado porque agora existem mais alternativas padrão (GNU readlink
e logo GNU realpath
), mas, na época, os utilitários GNU nem sequer possuíam readlink
. Esta implementação realpath
suporta alguns options
para impedir a resolução de link simbólico ou produzir saída terminada em nulo.
O BusyBox também inclui seu próprio realpath
comando (que não tem opção).
O GNU coreutils introduziu um realpath
comando na versão 8.15 em janeiro de 2012. Este é um substituto compatível para o BusyBox e o Debian realpath
e também possui muitas opções em comum com o GNU readlink
.
realpath
tem o mesmo efeito que readlink -f
com o GNU readlink
. O que distingue os dois comandos (ou melhor, os vários realpath
comandos readlink -f
) são as opções extras que eles suportam.
GNU realpath
não está obsoleto; tem o problema oposto: é novo demais para estar disponível em qualquer lugar. O Debian costumava omitir o GNUrealpath
do seu coreutils
pacote e manter o seu realpath
. Não sei por que, já que o GNU realpath
deve ser um substituto. No Debian jessie e no Ubuntu 16.04, no entanto, o GNU realpath
é usado.
Nos sistemas Linux, no momento, sua melhor opção para canonizar um caminho que pode conter links simbólicos é readlink -f
.
Os sistemas BSD têm um readlink
comando, com diferentes recursos do GNU readlink
. Em particular, o BSD readlink
não tem uma opção para canonizar caminhos, apenas percorre o link simbólico passado a ele.
readlink
, aliás, teve o mesmo problema - ele também foi inventado várias vezes (não adicionar esse utilitário quando links simbólicos foram adicionados ao Unix foi uma omissão lamentável). Agora, ele se estabilizou em várias implementações com muitos sinalizadores incompatíveis (em particular BSD vs. GNU).
readlink -f
estava no OpenBSD muito antes do GNU. Todo o NetBSD, FreeBSD e OpenBSD agora possuemreadlink -f
(o seu link até menciona).realpath
está no FreeBSD e no IRIX há muito tempo (não sei se é anterior ao Debian). HPUX e IRIX também têmreadlink
, embora não-f
. Orealpath
pacote no Debian experimental agora é o do coreutils (como um experimento para ver se ele quebra as coisas). O dwwwrealpath
age mais comoreadlink -e
enquanto o GNU um comoreadlink -f
por isso não é um dropin completa substituirrealpath
tem sido no FreeBSD desde 2002. Antes disso,pwd
estava fazendo isso (desde 2000,pwd some-file
chamariarealpath()
onfile
). Debian teve umrealpath
pacote desde 1996. A uma, IRIX provavelmente antecede-lo embora eu não encontrei nenhuma outra prova do que era no IRIX 6.5 em 1998. OpenBSD adicionou um-f
areadlink
em 1997 . O GNU foi adicionadoreadlink
em 2003 e possuía-f
desde o início.realpath
. Alguém sabe se é de alguma forma diferente dareadlink -f
versão?tl; dr
readlink -f
retornará0
para um arquivo inexistente em um diretório existente, enquantorealpath
retorna1
. No entanto,readlink -e
se comportará comorealpath
e retornará1
para um arquivo inexistente (consulte a nota do editor no final).readlink -f
readlink -e
realpath
readlink -f
com diretório inexistentereadlink -f
o comportamento varia dependendo de qual parte do caminho não existe.Disponibilidade
readlink
está instalado na maioria das distribuições Linux. Vistorealpath
que muitas vezes deve ser explicitamente instalado.Em suma
Se você deseja substituir as chamadas
realpath ...
, usereadlink -e ...
.Testado com readlink (GNU coreutils) 8.21 e realpath versão 1.19 no Ubuntu 16.
( Ed .: @AnthonyGeoghegan escreveu " isso se refere à versão Debian de
realpath
. A versão GNU dorealpath
comporta-se da mesma forma quereadlink -f
")fonte
realpath
. A versão GNU dorealpath
comporta-se da mesma forma quereadlink -f
.