2009-04-17 21 views

Respuesta

25

que 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) 
+0

Excelente respuesta: esperaba que esto también funcionara si obtenías el script, es decir '. /some/script.sh 'pero no es así. – synthesizerpatel

+4

@synthesizerpatel: en ksh93, tiene '$ {. Sh.file}' que también funciona para archivos de origen. –

+1

Como lo señala Gruik, esto no funciona si hay un enlace simbólico al script de shell en sí. Entonces, si vincula el comando a, digamos,/usr/bin, entonces __REAL_SCRIPTDIR devolverá/usr/bin, que (lo más probable) no es lo que quiere. Aparentemente necesita un readlink para este –

7

¿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" 
+0

gracias para la propina de $ 0, ¿qué es readlink? no parece estar en mi sistema – Brabster

+0

readlink es una aplicación simple en el paquete gnu coreutils – soulmerge

+0

Hmmm necesita algo totalmente dentro de ksh, sin dependencias. Gracias a – Brabster

1

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

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

Pruebe qué comando.

which scriptname 

le dará el nombre calificado completo del guión junto con su ruta absoluta

2

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 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 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 iniciar un script pasándolo como un argumento a un shell (/bin/sh /path/to/myscript.sh), $0 no es utilizable en este caso

Eché un vistazo a los "binarios" de mysql, muchos de ellos son realmente 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 hay una buena solución para localizar el guión dirigido

-1

Pruebe con esto:

dir = $(dirname $0) 
2

Esto es lo que hice:

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

El $ rPath variable contiene la ruta relativa el 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 
+0

. Este parece ser el único método disponible que resuelve la situación de un enlace simbólico al script en sí, por horrible que sea. –

6

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

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

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

8

En shell korn, todas estas soluciones de $ 0 fallan si está obteniendo 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 

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

+0

Esta respuesta debe ser incorporada en la aceptada. Estuve luchando durante media hora buscando mi script ksh hasta que me di cuenta de que necesitaba '$ _'. – andreee

0

Actualicé la respuesta de Edward Staudt, para poder tratar con enlaces simbólicos de ruta absoluta, 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

0

Usando $ _ proporciona el último comando.

>source my_script 

Works si emite el comando dos veces:

>source my_script 
>source my_script 

Si utilizo una secuencia diferente de comandos:

>who 
>source my_script 

los $ _ rendimientos variables "que"

Cuestiones relacionadas