¿Puedo obtener la ruta absoluta al script actual en KornShell?
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,
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)