A variável $ 0 contém as informações do caminho do script.
- Como posso alterar as informações do caminho para caminho absoluto? Quero dizer como processar ~,., .. ou similar?
- Como posso dividir as informações do caminho em diretório e nome de arquivo?
Eu poderia usar python / perl para isso, mas quero usar o bash, se possível.
Respostas:
Você não precisa processar coisas como
~
, o shell faz isso por você. É por isso que você pode passar~/filename
para qualquer script ou programa e ele funciona - todos esses programas não~
se autodenominam; seu shell converte o argumento para/home/username/filename
e passa para o programa:Se você precisar de um nome de arquivo canônico (que não inclua coisas como
..
), userealpath
(obrigado Neil ):Quanto à divisão do caminho no nome do diretório e no nome do arquivo, use
dirname
ebasename
:fonte
realpath
é melhor, masreadlink
parece funcionar quando eu tento; você conhece um exemplo em que ele falha?cd /tmp; touch foo; ln -s foo bar; cd; readlink /tmp/bar
. Isso retornafoo
erealpath
retorna/tmp/foo
, que é o que você deseja.readlink -f
(nota-f
) é quase equivalente arealpath
, e é mais portátil:readlink -f
nos GNU coreutils e existe em alguns outros sistemas também;realpath
é empacotado separadamente e pode não ser instalado (por exemplo, apenas 5 pacotes não tão comuns dependem dele no Ubuntu 10.04 ou Debian lenny).Usar dirname e basename como mencionado por Michael deve ser a maneira mais segura de obter o que você deseja.
De qualquer forma, se você realmente quiser fazer isso com "ferramentas apenas para o bash", poderá usar a substituição de parâmetro:
Este exemplo é retirado diretamente do Advanced Bash Scripting Guide, que vale uma olhada.
A explicação é bem simples:
Observe o padrão como algum regex e o
#
ou##
como algum tipo de modificador ganancioso / não ganancioso.Isso pode se tornar útil se você precisar fazer algumas extrações mais complicadas de uma parte de caminhos.
fonte
${...##...}
amigos e nãodirname
ebasename
que eles não funcionam em todos os casos. Por exemplo, ambos${0##*/}
e${0%/*}
expanda para o mesmo que$0
se$0
não contenha a/
.${0%/*}
não é uma boa alternativa paradirname
. No entanto, o que há de errado em usar em${0##*/}
vez debasename
?$0
é um nome de diretório com um final/
. Mas lamento meu conselho, porquedirname
não melhora.realpath
é um comando que informa o caminho real (remove .. e links simbólicos etc.)É padrão no FreeBSD. De acordo com esta discussão, também está disponível para Linux:
http://www.unix.com/shell-programming-scripting/89294-geting-real-path.html
Essa discussão também oferece uma solução bash:
fonte