Pregunta

¿Es posible encontrar la ruta completa al script que se está ejecutando actualmente en KornShell (ksh)?

es decir.si mi guión está en /opt/scripts/myscript.ksh, ¿puedo descubrir mediante programación dentro de ese script? /opt/scripts/myscript.ksh ?

Gracias,

¿Fue útil?

Solución

Se puede usar:

## __SCRIPTNAME - name of the script without the path
##
typeset -r __SCRIPTNAME="${0##*/}"

## __SCRIPTDIR - path of the script (as entered by the user!)
##
__SCRIPTDIR="${0%/*}"

## __REAL_SCRIPTDIR - path of the script (real path, maybe a link)
##
__REAL_SCRIPTDIR=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )

Otros consejos

En Korn, todas estas soluciones fallan $ 0 si está en fuente en el script en cuestión. La forma correcta de obtener lo que desea es utilizar $ _

$ cat bar

echo dollar under is $_
echo dollar zero is $0

$ ./bar

dollar under is ./bar
dollar zero is ./bar

$ . ./bar
dollar under is bar
dollar zero is -ksh

Note la última línea no? Utilice $ _. Por lo menos en Korn. YMMV en bash, csh, et al ..

¿Cómo se almacena la secuencia de comandos que se llamó en la variable 0 $. Puede utilizar readlink para obtener el nombre de fichero absoluto:

readlink -f "$0"

Bueno, me llevó un tiempo, pero éste es tan simple que grita.

_SCRIPTDIR=$(cd $(dirname $0);echo $PWD)

desde el CD opera en la cáscara generado con $ () que no afecta a la secuencia de comandos actual.

La variable $ rPath contiene la ruta relativa al archivo real o la trayectoria real de un archivo real.

CURPATH=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )

CURLOC=$CURPATH/`basename $0`

if [ `ls -dl $CURLOC |grep -c "^l" 2>/dev/null` -ne 0 ];then

    ROFFSET=`ls -ld $CURLOC|cut -d ">" -f2 2>/dev/null`

    RPATH=`ls -ld $CURLOC/$ROFFSET 2>/dev/null`

else

    RPATH=$CURLOC

fi

echo $RPATH

Esto es lo que hice:

if [[ $0 != "/"* ]]; then
  DIR=`pwd`/`dirname $0`
else
  DIR=`dirname $0`
fi

readlink -f sería el mejor si era portátil, ya que resuelve cada enlaces que se encuentran a ambos directorios y archivos.

En Mac OS X no hay readlink -f (excepto tal vez a través de macports), por lo que sólo se puede utilizar para obtener readlink el destino de un archivo de enlace simbólico específico.

La técnica $(cd -P ... pwd -P) es agradable, pero sólo funciona para resolver enlaces para directorios que conducen a la secuencia de comandos, no funciona si el guión en sí es un enlace simbólico

Además, un caso que no fue mencionado: cuando se inicia una secuencia de comandos pasando como argumento a una concha (/bin/sh /path/to/myscript.sh), $0 no es utilizable en este caso

Me echó un vistazo a MySQL "binarios", muchos de ellos son realmente scripts de shell; y ahora entiendo por qué piden una opción --basedir o necesitan ser lanzado desde un directorio de trabajo específico; esto se debe a que no hay una buena solución para localizar el guión dirigido

Esto funciona también, aunque no se dará por el camino "verdadero" si se trata de un enlace. Es más sencillo, pero menos exacta.

SCRIPT_PATH="$(whence ${0})"

Pruebe qué comando.

which scriptname

le dará el nombre completo del script junto con su ruta absoluta

He actualizado la respuesta de la Edward Staudt, para ser capaz de tratar con absoluta del trayecto de enlaces simbólicos, y con cadenas de enlaces también.

DZERO=$0
while true; do
  echo "Trying to find real dir for script $DZERO"
  CPATH=$( cd -P -- "$(dirname -- "$(command -v -- "$DZERO")")" && pwd -P )
  CFILE=$CPATH/`basename $DZERO`
  if [ `ls -dl $CFILE | grep -c "^l" 2>/dev/null` -eq 0 ];then
    break
  fi
  LNKTO=`ls -ld $CFILE | cut -d ">" -f2 | tr -d " " 2>/dev/null`
  DZERO=`cd $CPATH ; command -v $LNKTO`
done

feo, pero funciona ... Después de este plazo, el camino es $ CPATH y el archivo es $ CFILE

El uso $ _ proporciona el último comando.

>source my_script

Funciona si emite el comando dos veces:

>source my_script
>source my_script

Si utilizo una secuencia diferente de comandos:

>who
>source my_script

La $ _ rendimientos variables "que"

Trate de usar esto:

dir = $(dirname $0)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top