ti-enxame.com

Como faço para dividir a variável $ 0 para encontrar o diretório e os caminhos relativos no bash?

A variável $ 0 contém as informações do caminho do script.

  • Como posso alterar as informações do caminho para o caminho absoluto? Quero dizer, como processar ~,., .. ou semelhante?
  • 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.

10
prosseek

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
17
Michael Mrozek

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.

5
echox

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"
2
delete