GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puede un script bash saber el directorio en el que está instalado cuando se obtiene con . ¿operador?

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, el BASH_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 GNU readlink usando, p. preparado por brew install coreutils y reemplaza readlink por greadlink
  • 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 ... )


Linux
  1. ¿Cómo detener el script Loop Bash en la terminal?

  2. ¿Cómo establecer parámetros cuando Pipe Bash Script to Bash?

  3. ¿Cómo puedo usar Bash como shell de inicio de sesión cuando el administrador del sistema se niega a permitirme cambiarlo?

  4. ¿Cómo sé el nombre del archivo de script en un script Bash?

  5. ¿Cómo puedo probar mi script Bash en versiones anteriores de Bash?

Cómo escribir un script Bash con ejemplos

¿Cómo cambio el directorio en Git Bash con Git para Windows?

¿Cómo puedo instalar la última Anaconda con wget?

¿Cómo ejecutar un script bash?

¿Cómo ejecutar un script bash a través de una ruta absoluta?

¿Cómo ejecutar automáticamente un script cuando cambia el contenido de un directorio en Linux?