Existe um comando Unix para obter o caminho absoluto (e canônico) de um caminho relativo que pode conter links simbólicos?
63
Você pode usar o readlink
utilitário, com a -f
opção:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
Algumas distribuições, por exemplo, as que usam o GNU coreutils e o FreeBSD , também vêm com um realpath(1)
utilitário que basicamente apenas chama realpath(3)
e faz praticamente a mesma coisa.
-f
opção não existe no Mac OS X (pelo menos a partir de 10.8.5). Sem a-f
opção, apenas retorna um código de erro.readlink
nemrealpath
- Solaris e HP-UX, em particular.brew install coreutils
apple.stackexchange.com/a/69332/23040 , e se você não desejar executar a etapa que redireciona todas as ferramentas padrão da CLI do Mac para os equivalentes GNU recém-instalados, basta ligargreadlink
.Portably, a
PWD
variável é definida pelo shell para um local absoluto do diretório atual. Qualquer componente desse caminho pode ser um link simbólico.Se você deseja eliminar
.
e..
também, mude para o diretório que contém o arquivo e obtenha$PWD
lá:Não existe uma maneira portátil de seguir links simbólicos. Se você possui um caminho para um diretório, na maioria das unidades, ele
$(cd -- "$dir" && pwd -P 2>/dev/null || pwd)
fornece um caminho que não usa links simbólicos, porque shells que rastreiam links simbólicos tendem a ser implementadospwd -P
("P" para "físico").Alguns departamentos fornecem um utilitário para imprimir o caminho "físico" para um arquivo.
readlink -f
, assim como FreeBSD ≥8.3, NetBSD ≥4.0 e OpenBSD já em 2.2.realpath
(também está presente em alguns sistemas Linux e no BusyBox).Se o Perl estiver disponível, você poderá usar o
Cwd
módulo .fonte
pwd
($(cd -- "$dir" && pwd -P 2>/dev/null | pwd)
)? Parece que não se preocupa com stdin.||
É
pwd
adequado às suas necessidades? Fornece o caminho absoluto do diretório atual. Ou talvez o que você queira seja realpath () .fonte
alister
erss67
no presente artigo introduzir mais estável, compatível e maneira mais fácil. Eu nunca vi uma maneira melhor do que isso antes.Se você quiser voltar ao local original,
ou
Eu desejo que isso ajude. Essa foi a melhor solução para mim.
fonte
ABSPATH=$(cd -- "$RELPATH" && pwd)
. Observe as aspas duplas em torno da substituição (para não quebrar se o caminho contiver espaços em branco e caracteres brilhantes) e o--
(caso o caminho comece com-
). Além disso, isso funciona apenas para diretórios e não canoniza links simbólicos conforme solicitado. Veja minha resposta para mais detalhes.As outras respostas aqui foram boas, mas insuficientes para minhas necessidades. Eu precisava de uma solução que pudesse usar nos meus scripts em qualquer máquina. Minha solução foi escrever um script de shell que eu possa chamar dos scripts em que eu preciso.
Esta solução foi escrita para o Bourne Shell para portabilidade. Eu tenho isso em um script chamado "respath.sh".
Este script pode ser usado assim:
Ou assim
O script resolve o caminho no primeiro argumento usando o caminho do segundo argumento como ponto de partida. Se apenas o primeiro argumento for fornecido, o script resolverá o caminho relativo ao seu diretório de trabalho atual.
fonte
pwd
incorporado e não suporta-P
(o shell Bourne não implementou esse manuseio lógico de $ PWD como os shells POSIX).cd -P --
bem no caso do 1º argumento contém alguns ..case
cheque deve ser em..|../*)
vez de..*
.dirname $cwd
Caso, além disso, você tenha algum caminho predefinido para
$1
(geralmente${PWD}
), o seguinte funcionaria:fonte
Respeitando a resposta de todos, achei a função abaixo muito mais fácil e portátil entre o Linux / MAC OSX do que outras que encontrei em todos os lugares. Pode ajudar alguém.
fonte
Suponha que a variável a armazene um nome de caminho (a = "tanto faz")
1. Para o caminho potencial que contém espaço:
2. Para a pergunta real, ou seja, a conversão do caminho para absoluto: o readlink pode recuperar o conteúdo do link simbólico, que pode ser empregado da seguinte maneira. (a observação
readlink -f
seria perfeita, mas não está disponível no mínimo no Mac OS X bash, no qual -f significa FORMATS .)3. Apenas aprendi
pwd -P
emman pwd
: -P é " Exibir o diretório de trabalho físico atual (todos os links simbólicos resolvidos) " e, portanto,deve funcionar também.
Conclusão: combine 1 com 2 para atender a ambos os requisitos, enquanto os nomes de caminhos que contêm espaço já são tratados nos 3 mais concisos .
fonte