Creo $(dirname "$BASH_SOURCE")
hará lo que usted quiera, siempre y cuando el archivo que está obteniendo no un enlace simbólico.
Si el archivo que está obteniendo puede ser un enlace simbólico, puede hacer algo como lo siguiente para obtener el directorio verdadero:
PRG="$BASH_SOURCE"
progname=`basename "$BASH_SOURCE"`
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
dir=$(dirname "$PRG")
Esto es lo que podría ser una solución elegante:
script_path="${BASH_SOURCE[0]}"
script_dir="$(cd "$(dirname "${script_path}")" && pwd)"
Sin embargo, esto no funcionará al buscar enlaces. En ese caso, uno podría hacer
script_path="$(readlink -f "$(readlink "${BASH_SOURCE[0]}")")"
script_dir="$(cd "$(dirname "${script_path}")" && pwd)"
Cosas a tener en cuenta:
- matrices como
${array[x]}
no son compatibles con POSIX, pero entonces, elBASH_SOURCE
array solo está disponible en Bash, de todos modos - en macOS, el BSD nativo
readlink
no es compatible con-f
, por lo que es posible que deba instalar GNUreadlink
usando, p. preparado porbrew install coreutils
y reemplazareadlink
porgreadlink
- dependiendo de su caso de uso, es posible que desee utilizar el
-e
o-m
interruptores en lugar de-f
más posiblemente-n
; consulte la página de manual de readlink para obtener más información
Una forma diferente de abordar el problema:si está utilizando "." para establecer variables de entorno, otra forma estándar de hacerlo es hacer que su secuencia de comandos repita los comandos de configuración de variables, por ejemplo:
# settings.sh
echo export CLASSPATH=${CLASSPATH}:/foo/bar
luego evalúe la salida:
eval $(/path/to/settings.sh)
Así es como funcionan los paquetes como módulos. De esta manera también facilita el soporte de shells derivados de sh (X=...; export X
) y csh (setenv X ...
)