A variável $ 0 contém as informações do caminho do script.
Eu poderia usar python/Perl para isso, mas quero usar o bash, se possível.
Você não precisa processar coisas como ~
, a Shell faz isso por você. É por isso que você pode passar ~/filename
a qualquer script ou programa e funciona - todos esses programas não lidam com ~
próprios, seu Shell converte o argumento para /home/username/filename
e passa isso para o programa:
$ echo ~/filename
/home/mrozekma/filename
Se você precisar de um nome de arquivo canônico (um que não inclua coisas como ..
), use realpath
(obrigado Neil ):
$ realpath ~/../filename
/home/filename
Quanto à divisão do caminho em nome de diretório e nome de arquivo, use dirname
e basename
:
$ dirname /foo/bar/baz
/foo/bar
$ basename /foo/bar/baz
baz
Usar dirname e basename como mencionado por Michael deve ser a maneira mais segura de conseguir o que deseja.
De qualquer forma, se você realmente quiser fazer isso com "ferramentas somente bash", poderá usar a substituição de parâmetro:
echo `basename $PWD` # Basename of current working directory.
echo "${PWD##*/}" # Basename of current working directory.
echo
echo `basename $0` # Name of script.
echo $0 # Name of script.
echo "${0##*/}" # Name of script.
echo
filename=test.data
echo "${filename##*.}" # data
# Extension of filename.
Este exemplo foi retirado diretamente do Advanced Bash Scripting Guide que vale a pena dar uma olhada.
A explicação é muito simples:
$ {var # Pattern} Remova de $ var a parte mais curta de $ Pattern que corresponde ao front end de $ var. $ {var ## Pattern} Remova de $ var a parte mais longa de $ Pattern que corresponde ao front end de $ var.
Observe o padrão como algum regex e o #
ou ##
como algum tipo de modificador ganancioso/não ganancioso.
Isso pode ser útil se você tiver que fazer algumas extrações mais complicadas de uma parte do caminho.
realpath
é um comando que indica 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:
$ bash -c "cd /foo/../bar/ ; pwd"