Experimente as seguintes one-liners simples:
Para todos os sistemas UNIX / OSX / Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
Bater
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
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:
cd "$(dirname "$(realpath "$0")")";
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):
cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
Para específico do Linux:
cd "$(dirname "$(readlink -f "$0")")"
Usando o GNU readlink no * BSD / Mac:
cd "$(dirname "$(greadlink -f "$0")")"
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:
cd "${0%/*}"
mas não funcionará se o script for executado no mesmo diretório.
Como alternativa, você pode definir a seguinte função no bash:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
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 :
function realpath()
{
f=$@
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
Relacionado:
Veja também:
Como posso obter o comportamento do readlink -f do GNU em um Mac?