Pruebe las siguientes frases sencillas:
Para todos UNIX / OSX / Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
Golpetazo
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
Nota: Se utiliza un guión doble (-) en los comandos para indicar el final de las opciones del comando, por lo que los archivos que contienen guiones u otros caracteres especiales no romperán el comando.
Nota: en Bash, use ${BASH_SOURCE[0]}
a favor de $0
, de lo contrario, la ruta puede romperse al obtenerla ( source
/ .
).
Para Linux, Mac y otros * BSD:
cd "$(dirname "$(realpath "$0")")";
Nota: realpath
debe instalarse en la distribución Linux más popular de forma predeterminada (como Ubuntu), pero en algunos puede faltar, por lo que debe instalarla.
Nota: Si está usando Bash, use ${BASH_SOURCE[0]}
a favor de $0
, de lo contrario, la ruta puede romperse al obtenerla ( source
/ .
).
De lo contrario, podría intentar algo como eso (usará la primera herramienta existente):
cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
Para Linux específico:
cd "$(dirname "$(readlink -f "$0")")"
Usando GNU readlink en * BSD / Mac:
cd "$(dirname "$(greadlink -f "$0")")"
Nota: debe tener coreutils
instalado (por ejemplo, 1. Instalar Homebrew , 2. brew install coreutils
).
En bash
En bash puedes usar las expansiones de parámetros para lograr eso, como:
cd "${0%/*}"
pero no funciona si el script se ejecuta desde el mismo directorio.
Alternativamente, puede definir la siguiente función en bash:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
Esta función toma 1 argumento. Si el argumento ya tiene una ruta absoluta, imprímala como está; de lo contrario, imprima la $PWD
variable + argumento del nombre de archivo (sin ./
prefijo).
o aquí está la versión tomada del .bashrc
archivo 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:
Ver también:
¿Cómo puedo obtener el comportamiento de readlink -f de GNU en una Mac?