¿El script de shell de Unix descubre en qué directorio reside el archivo de script?
Básicamente, necesito ejecutar el script con rutas relacionadas con la ubicación del archivo del script de Shell. ¿Cómo puedo cambiar el directorio actual al mismo directorio donde reside el archivo del script?
En Bash, deberías obtener lo que necesitas de esta manera:
#!/usr/bin/env bash
BASEDIR=$(dirname "$0")
echo "$BASEDIR"
La publicación original contiene la solución (ignore las respuestas, no agregan nada útil). El trabajo interesante lo realiza el comando Unix mencionado readlink
con la opción -f
. Funciona cuando el script es llamado tanto por una ruta absoluta como por una relativa.
Para bash, sh, ksh:
#!/bin/bash
# Absolute path to this script, e.g. /home/user/bin/foo.sh
SCRIPT=$(readlink -f "$0")
# Absolute path this script is in, thus /home/user/bin
SCRIPTPATH=$(dirname "$SCRIPT")
echo $SCRIPTPATH
Para tcsh, csh:
#!/bin/tcsh
# Absolute path to this script, e.g. /home/user/bin/foo.csh
set SCRIPT=`readlink -f "$0"`
# Absolute path this script is in, thus /home/user/bin
set SCRIPTPATH=`dirname "$SCRIPT"`
echo $SCRIPTPATH
Ver también: https://stackoverflow.com/a/246128/59087
Un comentario anterior sobre una respuesta lo decía, pero es fácil pasarlo por alto entre todas las demás respuestas.
Al usar bash:
echo this file: "$BASH_SOURCE"
echo this dir: "$(dirname "$BASH_SOURCE")"
Manual de referencia de Bash, 5.2 Variables de Bash
Suponiendo que estás usando bash
#!/bin/bash
current_dir=$(pwd)
script_dir=$(dirname "$0")
echo $current_dir
echo $script_dir
Este script debe imprimir el directorio en el que se encuentra y luego el directorio en el que se encuentra el script. Por ejemplo, cuando lo llama desde /
con el script en /home/mez/
, genera
/
/home/mez
Recuerde, cuando asigne variables a partir de la salida de un comando, incluya el comando en $(
y )
, o no obtendrá el resultado deseado.
La mejor respuesta para esta pregunta se respondió aquí:
Obtener el directorio fuente de un script Bash desde dentro
Y es:
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Una sola línea que le dará el nombre completo del directorio del script sin importar desde dónde se llame.
Para entender cómo funciona puedes ejecutar el siguiente script:
#!/bin/bash
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
TARGET="$(readlink "$SOURCE")"
if [[ $TARGET == /* ]]; then
echo "SOURCE '$SOURCE' is an absolute symlink to '$TARGET'"
SOURCE="$TARGET"
else
DIR="$( dirname "$SOURCE" )"
echo "SOURCE '$SOURCE' is a relative symlink to '$TARGET' (relative to '$DIR')"
SOURCE="$DIR/$TARGET" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
fi
done
echo "SOURCE is '$SOURCE'"
RDIR="$( dirname "$SOURCE" )"
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
if [ "$DIR" != "$RDIR" ]; then
echo "DIR '$RDIR' resolves to '$DIR'"
fi
echo "DIR is '$DIR'"