Suponha que eu tenha um arquivo bash chamado myBash.bash
. 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 quero configurar uma pasta zip com código que possa ser iniciado por um script bash dentro desse arquivo zip. Conheço os caminhos de arquivo relativos do código dentro desse arquivo zip, mas não os caminhos absolutos, e preciso deles. Uma maneira seria codificar 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 está sozinho e, em seguida, criar os caminhos relevantes para o outro arquivo a partir do seu conhecimento da estrutura do arquivo zip.
fonte
Respostas:
Você pode obter o caminho completo como:
E, como apontado por Serg, você pode usar
dirname
para remover o nome do arquivo assimou melhor ainda, para evitar citações difíceis e divisão de palavras com nomes de arquivos difíceis:
Muito melhor do que minha ideia anterior, que era analisá-la (eu sabia que haveria uma maneira melhor!)
Notas
realpath
retorna o caminho real de um arquivo$0
é este arquivo (o script)s|old|new|
substituaold
pornew
\(.*\)/
salve os caracteres antes/
para depois\1
a parte salvafonte
$0
esed
magia. Mas ased
mágica mencionada é realmente desnecessária quandodirname
existem ferramentas como a #realpath
:realpath "$( dirname $0 )"
Eu pessoalmente usaria,readlink
mas sou eu:readlink -e $(dirname $0)
dirname "$(realpath "$0")"
seria melhor? Geralmente, é necessário conhecer o diretório pai do arquivo referenciado em vez do diretório pai do link simbólico referente ao referido arquivo."$(dirname "$(realpath "$0")")"
é a maneira mais direta. Citações dentro do$()
trabalho normalmente.$()
ser um subshell permitirá cotações do lado de fora. Eu não diria que é como se simples, a menos que se percebe$()
são todos subshellsse o script estiver no seu caminho, você pode usar algo como
EDIT: depois de ler os comentários do Serg, essa pode ser uma solução genérica que funciona se o script está no seu caminho ou não.
fonte
which
é mais adequado para quando o script reside em um dos diretórios que fazem parte daPATH
variável. Use$0
de dentro de um script, como mostra Zanna. Mas sua resposta é correta, já que você usa emdirname
vez de mexer comsed
, portanto, +1 para isso #A resposta aceita parece perfeita. Aqui está outra maneira de fazer isso:
/bin/pwd
imprime o caminho real do diretório, em oposição aopwd
comando interno.fonte
É tomado como referência de kenorb e andro
Sem nome de diretório, readlink, caminho real, BASH_SOURCE
Todos são internos
fonte