Em um script, entro no $0
possível caminho relativo para ele. Para convertê-lo em absoluto, encontrei esta solução que não entendo:
abspath=$(cd ${0%/*} && echo $PWD/${0##*/})
Meu problema é a mágica dentro de ${0%/*}
e ${0##*/}
. Parece que o primeiro extrai o nome do diretório e o último extrai o nome do arquivo, apenas não entendo como.
readlink -f $0
o caminho canônico.dirname
utilitário é útil aqui.BASH_SOURCE
é melhor do que$0
, pois$0
fornece o comando digitado pelo usuário, que pode não ser o script em execução no momento.Respostas:
Definições:
${string%substring}
exclui a correspondência mais curta de$substring
do final de$string
.${string##substring}
exclui a correspondência mais longa de$substring
desde o início de$string
.Seu exemplo:
${0%/*}
exclui tudo após a última barra, fornecendo o nome do diretório do script (que pode ser um caminho relativo).${0##*/}
exclui tudo até a última barra, fornecendo apenas o nome do script.Portanto, esse comando muda para o diretório do script e concatena o diretório de trabalho atual (fornecido por
$PWD
) e o nome do script, fornecendo o caminho absoluto.Para ver o que está acontecendo, tente:
fonte
Shawn teve a solução mais simples:
readlink -f $0
. Se você quiser ter certeza absoluta de lidar com nomes de arquivos estranhos, use:Documentação
fonte
readlink -fn
é específico para Linux, NetBSD e OpenBSD.Aqui está uma maneira mais segura e legível de fazer este trabalho:
Notas:
$0
for um nome de arquivo simples, sem caminho anterior, o script original falhará, mas o fornecido aqui funcionará. (Não é um problema,$0
mas pode estar em outros aplicativos.)$0
, mas pode estar em outros aplicativos.)unset
é essencial se seu usuário pode terCDPATH
definido.readlink -f
ourealpath
, isso funcionará em versões não Linux do Unix (por exemplo, Mac OS X).fonte
Se você deseja aprender a expansão de parâmetros do shell, pode lê-lo aqui , mas a expansão nem sempre é uma boa escolha. Nesse caso, quase todos os sistemas Unix possuem 2 bons utilitários:
O primeiro extrairá o nome do arquivo, enquanto o segundo extrairá o caminho; portanto, se você tiver $ 0, diga:
E você vai pegar o caminho.
Felicidades
fonte
Apresentando o pwd, o bash embutido. Também encontrado no pacote GNU coreutils.
fonte