Diretório de trabalho presente (ou atual)
Does the command pwd in a shell script return the directory the shell script is in?
Não.
Em primeiro lugar, por definição, nenhum shell script ou comando shell retorna nada além de um status de saída numérico entre 0 e 255. Isso é axiomático, mas geralmente não é o que as pessoas querem dizer quando fazem esses tipos de perguntas.
Em segundo lugar, pwd
é tanto um Bourne shell builtin e um sistema padrão binário. Qualquer um imprime o diretório de trabalho atual lógico ou físico , que geralmente é:
- Sua localização na estrutura de diretórios quando você chama um script ou binário.
- Seu local atual depois de alterar o diretório de trabalho com cd ou outros utilitários e builtins que modificam o diretório de trabalho atual, como pushd ou popd.
Se você quiser o diretório do script atual, use o utilitário dirname
, conforme descrito na seção final abaixo.
Teste rápido de pwd
Como um teste rápido para ver o que pwd realmente imprime, você pode executar o seguinte:
# Create a shell script containing pwd.
cat <<-EOF > /tmp/test_pwd.sh
#!/bin/sh
pwd
EOF
# Make the script executable.
chmod 755 /tmp/test_pwd.sh
# Go somewhere on the filesystem, and call the test script.
cd /etc
/tmp/test_pwd.sh
Isso imprimirá /etc
, não /tmp
, porque seu diretório de trabalho atual é atualmente /etc
. Esse é o comportamento esperado.
Obtendo o diretório contendo um script
Provavelmente você está fazendo esta pergunta porque deseja encontrar o diretório do script atual. No caso geral, o seguinte é a solução rápida e suja:
#!/usr/bin/env bash
echo $(dirname "$0")
Isso funciona porque $0
geralmente contém o nome de caminho usado para invocar o script que está sendo executado, e a expansão de shell usa o utilitário dirname
para retornar o caminho, excluindo a parte do nome do arquivo. Você pode fazer algo semelhante, mas menos portável, com a expansão do parâmetro Bash "${0%/*}"
.
Isso tudo é uma vasta simplificação, é claro. Leia o manual de Bash (especialmente as seções sobre parâmetros posicionais, parâmetros especiais e BASH_SOURCE ) e as man pages para readlink
e realpath
para obter uma compreensão mais completa de quais são os casos de borda, dos quais existem vários.
No entanto, no script do dia-a-dia, o componente de diretório de $0
é suficiente para dizer o que você deseja saber. Se você está fazendo algo complicado o suficiente, onde $0
não contém as informações que você realmente precisa, e você precisa de construções mais complicadas como:
echo $(dirname "$(realpath "$0")")
então provavelmente você está tornando sua vida mais difícil do que precisa ser.