¿Cómo se puede obtener el directorio en el que se está ejecutando un script de shell?

¿Cómo se obtiene la ruta del directorio en el que se encuentra un script desde el propio código del script que se está ejecutando?

La razón por la que necesito obtener el directorio es que he creado un script Bash que hace de lanzador de una aplicación. Lo que me gustaría es cambiar el directorio de trabajo al lugar en el que se encuentra el script de Bash para poder acceder a los archivos que se encuentran en ese directorio.


Estás leyendo una traducción autorizada de la pregunta Can a Bash script tell what directory it's stored in? planteada por Jiaaro en StackOverflow.

Respuestas

#1

Esta línea te devuelve la ruta completa del directorio donde se encuentra el script, sin importar desde dónde se ha llamado:

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

El único caso en el que la línea anterior no funciona es cuando la última parte del directorio es un enlace simbólico. Si quieres resolver estos enlaces, entonces debes reemplazar la línea anterior por lo siguiente, que es bastante más complejo:

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

Esta segunda solución funciona bien en cualquier caso, incluso con enlaces simbólicos.