Qual é a diferença entre “realpath” e “readlink -f”?

54

Eu li muito sobre o comando realpath e como ele foi preterido, com o readlink -f sendo recomendado agora. Eu também vi em alguns lugares que a razão pela qual o realpath foi introduzido foi pela falta de tal funcionalidade no readlink e que uma vez que foi introduzido, o realpath não era mais necessário e seu suporte descontinuado pela maioria dos fornecedores de SO.

O motivo da minha pergunta é que eu também vi muitas pessoas recomendando readlink -f como um comando "muito parecido" com realpath , e é isso que está me incomodando, porque ninguém elabora muito semelhante "parte. Quais são as diferenças reais?

    
por Felipe Leão 10.06.2014 / 23:01

2 respostas

58

Existem vários comandos realpath em volta.

O utilitário realpath é um wrapper em torno das funções de biblioteca realpath e tem foi reinventado muitos horários .

O Debian mantém um pacote realpath ( separado de dwww desde woody ) que não foi alterado, exceto em relação ao empacotamento e documentação desde 2001. Este utilitário foi descontinuado porque agora existem mais alternativas padrão (GNU readlink e em breve GNU realpath ), mas na época, os utilitários GNU nem sequer tinham readlink . Esta implementação de realpath suporta alguns options para evitar a resoluçà £ o de link simbólico ou produzir uma saÃda terminada com valor nulo. O BusyBox também inclui o seu próprio realpath comando (que não tem opção).

GNU coreutils introduziu um realpath command in versão 8.15 em janeiro de 2012. Este é um substituto compatível para o realpath do BusyBox e do Debian, e também tem 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 comandos realpath de readlink -f ) são as opções extras que eles suportam.

O GNU realpath não está obsoleto; tem o problema oposto: é novo demais para estar disponível em todos os lugares. Neste momento, o Debian ainda omite o GNU realpath do seu coreutils pacote e varas com seu próprio realpath . Eu não sei porque, desde GNU realpath deve ser um substituto de drop-in. A partir do 14.04, o Ubuntu não reconhece o Debian sobre isso.

Em sistemas Linux, no momento, sua melhor aposta para canonizar um caminho que pode conter links simbólicos é readlink -f .

Os sistemas BSD têm um comando readlink , com diferentes recursos de GNU readlink . Em particular, o BSD readlink não tem uma opção para canonicalizar caminhos, ele apenas percorre o symlink passado para ele.

readlink , aliás, teve o mesmo problema - também foi inventado várias vezes (não adicionar este utilitário quando links simbólicos foram adicionados ao Unix foi uma omissão lamentável). Ele agora estabilizou em várias implementações com muitos flags incompatíveis (em particular BSD vs. GNU).

    
por 11.06.2014 / 04:05
12

tl; dr readlink -f retornará 0 para um arquivo inexistente em um diretório existente, enquanto realpath retornará 1 . No entanto, readlink -e se comportará como realpath e retornará 1 para um arquivo inexistente (consulte a nota do editor no final).

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 com diretório inexistente

O comportamento

readlink -f varia dependendo de qual parte do caminho não existe.

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

Em resumo

Se você quiser substituir as chamadas para realpath ... , use readlink -e ... .


Testado com readlink (GNU coreutils) 8.21 e realpath versão 1.19 .

( Ed.: @AnthonyGeoghegan escreveu " isto se refere à versão Debian de realpath . A versão GNU de realpath se comporta da mesma forma que readlink -f ")

    
por 02.12.2015 / 23:32

Tags