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

9

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 similar?
  • Como posso dividir as informações do caminho no diretório e no nome do arquivo?

Eu poderia usar python / perl para isso, mas eu quero usar o bash se possível.

    
por prosseek 07.09.2010 / 23:12

3 respostas

17

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 funciona - todos esses programas não lidam com ~ , seu shell converte o argumento para /home/username/filename e passa para o programa:

$ echo ~/filename
/home/mrozekma/filename

Se você precisar de um nome de arquivo canônico (um que não inclua itens como .. ), use realpath (thanks Neil ):

$ realpath ~/../filename
/home/filename

Quanto a dividir o caminho no nome do diretório e no nome do arquivo, use dirname e basename :

$ dirname /foo/bar/baz
/foo/bar

$ basename /foo/bar/baz
baz
    
por 07.09.2010 / 23:26
5

O uso de dirname e basename, como mencionado por Michael, deve ser a maneira mais segura de conseguir o que você deseja.

De qualquer forma, se você realmente quer fazer isso com "bash only tools", você pode usar a substituição de parâmetros:

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 é retirado diretamente do Guia de script avançado de bash que vale a pena olhe.

A explicação é bem simples:

${var#Pattern} Remove from $var the shortest part of $Pattern that matches the front end of $var. ${var##Pattern} Remove from $var the longest part of $Pattern that matches the front end of $var.

Observe o padrão como um 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 de caminhos.

    
por 07.09.2010 / 23:39
2

realpath é um comando que informa o caminho real (remove ... e links simbólicos, etc.)

É padrão com o FreeBSD. De acordo com esta discussão, também está disponível para Linux:

link

Essa discussão também oferece uma solução bash:

$ bash -c "cd /foo/../bar/ ; pwd"
    
por 08.09.2010 / 01:55