Ao escrever um script bash, como obtenho o caminho absoluto da localização do arquivo atual?

8

Suponha que eu tenha um arquivo bash chamado myBash.bash . Ele reside em:

/myDirect/myFolder/myBash.bash

Agora eu quero usar a string /myDirect/myFolder (a localização de myBash.bash ) dentro do script. Existe um comando que eu possa usar para encontrar este local?

Edit: A idéia é que eu queira configurar uma pasta zip com código que pode ser iniciado por um script bash dentro desse arquivo zip. Eu conheço os caminhos de arquivo relativos do código dentro daquele arquivo zip, mas não os caminhos absolutos, e eu preciso disso. Uma maneira seria codificar permanentemente no caminho ou exigir que o caminho do arquivo seja fornecido como uma variável. No entanto, eu acharia mais fácil se fosse possível para o arquivo bash descobrir onde ele está sozinho e, em seguida, criar os caminhos relevantes para o outro arquivo a partir de seu conhecimento da estrutura do arquivo zip.

    
por dimpol 17.03.2017 / 09:33

3 respostas

14

Você pode obter o caminho completo como:

realpath "$0"

E como apontado por Serg você pode usar dirname para remover o nome do arquivo como este

dirname "$(realpath $0)"

ou melhor ainda para evitar citações inconvenientes e divisão de palavras com nomes de arquivo difíceis:

temp=$( realpath "$0"  ) && dirname "$temp"

Muito melhor do que a minha ideia anterior que era analisá-la (eu sabia que haveria uma maneira melhor!)

realpath "$0" | sed 's|\(.*\)/.*||'

Notas

  • realpath retorna o caminho real de um arquivo
  • $0 é esse arquivo (o script)
  • s|old|new| replace old com new
  • \(.*\)/ salva todos os caracteres antes de / para mais tarde
  • da parte salva
por Zanna 17.03.2017 / 10:13
5

se o script estiver no seu caminho, você pode usar algo como

$ myloc=$(dirname "$(which foo.sh)")
$ echo "$myloc"
/path/to/foo.sh

EDIT: depois de ler os comentários do Serg, isso pode ser uma solução genérica que funciona se o script está no seu caminho ou não.

myloc==$(dirname "$(realpath $0)")
dirname "$myloc"
    
por Antonello Piemonte 17.03.2017 / 09:56
3

A resposta aceita parece perfeita. Aqui está outra maneira de fazer isso:

cd "$(dirname "$0")"
/bin/pwd

/bin/pwd imprime o caminho real do diretório, ao contrário do comando pwd builtin.

    
por serv-inc 17.03.2017 / 16:53