¿El script de shell de Unix descubre en qué directorio reside el archivo de script?

Resuelto William Yeung asked hace 15 años • 19 respuestas

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?

William Yeung avatar Oct 28 '08 15:10 William Yeung
Aceptado

En Bash, deberías obtener lo que necesitas de esta manera:

#!/usr/bin/env bash

BASEDIR=$(dirname "$0")
echo "$BASEDIR"
TheMarko avatar Oct 28 '2008 08:10 TheMarko

La publicación original contiene la solución (ignore las respuestas, no agregan nada útil). El trabajo interesante lo realiza el comando Unix mencionado readlinkcon 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

al. avatar Oct 28 '2009 16:10 al.

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

Daniel avatar Apr 05 '2013 02:04 Daniel

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.

Mez avatar Oct 28 '2008 08:10 Mez

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'"
Alexandro de Oliveira avatar Jun 20 '2017 05:06 Alexandro de Oliveira