elif shell unix scripting path ksh

shell - elif - if aix



¿Puedo obtener la ruta absoluta al script actual en KornShell? (12)

Actualicé la respuesta de Edward Staudt, para poder lidiar con enlaces simbólicos de ruta absoluta, y también con cadenas de enlaces.

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 ejecutar esto, la ruta es $ CPATH y el archivo es $ CFILE

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

es decir, si mi script está en /opt/scripts/myscript.ksh , ¿puedo programar dentro de ese script descubrir /opt/scripts/myscript.ksh ?

Gracias,


Bueno, me tomó un tiempo, pero este es tan simple que grita.

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

ya que el CD opera en el shell generado con $ () no afecta al script actual.


En korn shell, todas estas soluciones de $ 0 fallan si se está abasteciendo en el script en cuestión. La forma correcta de obtener lo que desea es usar $ _

$ 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

Observe la última línea allí? Utilice $ _. Al menos en Korn. YMMV en bash, csh, et al ..


Esto es lo que hice:

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


Esto también funciona, aunque no proporcionará la ruta "verdadera" si es un enlace. Es más sencillo, pero menos exacto.

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


Intenta usar esto:

dir = $(dirname $0)


Intente qué comando.

which scriptname

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


La forma en que se llamó al script se almacena en la variable $ 0. Puedes usar readlink para obtener el nombre de archivo absoluto:

readlink -f "$0"


La variable $ RPATH contiene la ruta relativa al archivo real o la ruta real para 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


Podrías 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 )


Usando $ _ proporciona el último comando.

>source my_script

Funciona si emito el comando dos veces:

>source my_script >source my_script

Si utilizo una secuencia diferente de comandos:

>who >source my_script

La variable $ _ devuelve "quien"


readlink -f sería lo mejor si fuera portable, ya que resuelve todos los enlaces encontrados para directorios y archivos.

En mac os x no hay readlink -f (excepto tal vez a través de macports), por lo que solo puede usar readlink para obtener el destino de un archivo de enlace simbólico específico.

La técnica $(cd -P ... pwd -P) es buena pero solo funciona para resolver los enlaces de los directorios que conducen al script, no funciona si el script en sí es un enlace simbólico.

Además, un caso que no se mencionó: cuando inicia un script al pasarlo como un argumento a un shell ( /bin/sh /path/to/myscript.sh ), $0 no se puede usar en este caso

Eché un vistazo a los "binarios" de mysql, muchos de ellos son en realidad scripts de shell; y ahora entiendo por qué piden una opción --basedir o necesitan iniciarse desde un directorio de trabajo específico; Esto se debe a que no existe una buena solución para localizar el script de destino.