Estou escrevendo um script bash. Eu preciso que o diretório de trabalho atual seja sempre o diretório em que o script está localizado
O comportamento padrão é que o diretório de trabalho atual no script é o do shell no qual eu o executo, mas não quero esse comportamento.
myscript path/to/file
, espero que o script avalie o caminho / para / arquivo em relação ao MEU diretório atual, não em qualquer diretório em que o script ocorra para ser localizado. Além disso, o que aconteceria com um script executadossh remotehost bash < ./myscript
conforme mencionado no FAQ do BASH?cd "${BASH_SOURCE%/*}" || exit
Respostas:
fonte
$0
. No seu script, você pode esperar, por exemplo,../../
consultar o diretório dois níveis acima da localização do script, mas esse não é necessariamente o caso se houver links simbólicos em jogo../script
,.
é o diretório correto e a alteração para.
ele também terminará no próprio diretório em quescript
está localizado, ou seja, no diretório de trabalho atual.bash script.sh
, o valor de$0
éscript.sh
. A única maneira de ocd
comando "funcionar" para você é porque você não se importa com comandos com falha. Se você usarset -o errexit
(aka:)set -e
para garantir que seu script não exagere nos comandos com falha, isso NÃO funcionará porquecd script.sh
é um erro. A maneira confiável [específica do bash] écd "$(dirname ${BASH_SOURCE[0]})"
O seguinte também funciona:
A sintaxe é descrita detalhadamente nesta resposta do StackOverflow.
fonte
bash script.sh
-$0
será apenas o nome do arquivoExperimente as seguintes one-liners simples:
Para todos os sistemas UNIX / OSX / Linux
Bater
Nota: Um traço duplo (-) é usado nos comandos para indicar o final das opções de comando, para que arquivos contendo traços ou outros caracteres especiais não quebrem o comando.
Nota: No Bash, use a
${BASH_SOURCE[0]}
favor de$0
, caso contrário, o caminho poderá ser interrompido ao buscá-lo (source
/.
).Para Linux, Mac e outros * BSD:
Nota:
realpath
deve ser instalado na distribuição Linux mais popular por padrão (como o Ubuntu), mas em alguns pode estar faltando, então você precisa instalá-lo.Nota: Se você estiver usando o Bash, use a
${BASH_SOURCE[0]}
favor de$0
, caso contrário, o caminho poderá ser interrompido ao buscá-lo (source
/.
).Caso contrário, você poderia tentar algo assim (ele usará a primeira ferramenta existente):
Para específico do Linux:
Usando o GNU readlink no * BSD / Mac:
Nota: Você precisa ter
coreutils
instalado (por exemplo, 1. Instale o Homebrew , 2.brew install coreutils
).Na festança
No bash, você pode usar as Expansões de parâmetros para conseguir isso, como:
mas não funcionará se o script for executado no mesmo diretório.
Como alternativa, você pode definir a seguinte função no bash:
Esta função leva 1 argumento. Se o argumento já tiver um caminho absoluto, imprima-o como está; caso contrário, imprima a
$PWD
variável + argumento do nome do arquivo (sem./
prefixo).ou aqui está a versão tirada do
.bashrc
arquivo Debian :Relacionado:
Como detectar o diretório atual no qual eu executo meu shell script?
Obter o diretório de origem de um script Bash de dentro do próprio script
Caminho absoluto do script Bash com OS X
Maneira confiável de um script Bash obter o caminho completo para si mesmo
Veja também:
Como posso obter o comportamento do readlink -f do GNU em um Mac?
fonte
cp
comando, @kenorb?--
) é usado nos comandos para indicar o final das opções de comando, para que arquivos contendo traços ou outros caracteres especiais não quebrem o comando. Tente, por exemplo, criar o arquivo viatouch "-test"
etouch -- -test
, em seguida, remova o arquivo viarm "-test"
erm -- -test
, e veja a diferença.realpath
pacote Debian está obsoleto, não o GNUrealpath
. Se você acha que não está claro, pode sugerir uma edição.É fácil. Funciona.
fonte
cd "${BASH_SOURCE%/*}" || exit
A resposta aceita funciona bem para scripts que não foram vinculados a outro lugar, como em
$PATH
.No entanto, se o script for executado por meio de um link simbólico,
Isso cdará no
~/bin/
diretório e não no~/project/
diretório, o que provavelmente interromperá seu script se o objetivo docd
é incluir dependências relativas a~/project/
A resposta segura do link simbólico está abaixo:
readlink -f
é necessário para resolver o caminho absoluto do arquivo potencialmente vinculado.As aspas são necessárias para dar suporte a caminhos de arquivos que potencialmente podem conter espaços em branco (prática recomendada, mas não é seguro supor que esse não seja o caso)
fonte
Este script parece funcionar para mim:
A linha de comando pwd ecoa a localização do script como o diretório de trabalho atual, não importa de onde eu o execute.
fonte
realpath
é improvável que seja instalado em qualquer lugar. O que pode não interessar, dependendo da situação do OP.realpath
mas possui oreadlink
que parece ser semelhante.Obtenha o caminho real para o seu script
(Esta é a resposta para a mesma pergunta aqui: Obtenha o nome do diretório em que um script é executado )
fonte
fonte
PWD é uma variável de ambiente.
fonte
Se você apenas precisar imprimir o diretório de trabalho atual, poderá seguir isso.
Dê permissão de execução:
Em seguida, execute o script
./test
e poderá ver o diretório de trabalho atual.fonte
pwd
? Parece um monte de pressionamentos de tecla desperdiçados para mim.