2011-06-09 21 views
8

¿Cómo puedo obtener el directorio en el que se encuentra un archivo de script bash, cuando el archivo de script se incluye desde otro (que lo hace diferente de this question)?Obtener el directorio de un archivo de script bash en

/script1.sh

. /dir2/script2.sh 

/dir2/script2.sh

# echoes "/dir2" 
echo whatevergetsthatdir 

Este es el guión que estoy tratando de "arreglar"

/etc/init.d/s ilvercar-gameserver (única para todos los casos)

#!/bin/bash 
# 
#  /etc/rc.d/init.d/silvercar-gameserver 
# 
#  Initscript for silvercar game server 
# 
# chkconfig: 2345 20 80 
# description: lalalalala 

#CONFIG 
BIN=/opt/silvercar-gameserver # Want to get rid of this 
CONF=/etc/opt/silvercar-gameserver 

. /etc/init.d/functions 
. $BIN/gameserver.sh.inc 

exit 0 

/opt/silvercar-gameserver/gameserver.sh.inc (no puede cambiar para cada instalación. está en svn)

# Meant to be included from a script in init.d 
# Required input: 
# CONF (e.g. /etc/opt/silvercarserver) 


# -- Installation config (must provide JSVC, JAVA_HOME) 
. $BIN/localconf.sh 

# -- Instance config (must provide ASUSER, ASWORK) 
. $CONF/conf.sh 

PIDFILE=$ASWORK/running.pid 
LOGDIR=$ASWORK/log 
CLASS=tr.silvercar.gameserver.runner.DaemonGameServer 
ARGS=$CONF 

start() { 
    echo "Going to start Gameserver..." 

    export JAVA_HOME 
    cd $BIN 
    $JSVC -jvm server -procname silvercar-gameserver -pidfile $PIDFILE -user $ASUSER -outfile $LOGDIR/stdout -errfile $LOGDIR/stderr \ 
      -cp `cat classpath` -Dlogroot=$LOGDIR $CLASS $ARGS 

    echo "Gameserver started!" 
} 

stop() { 
    echo "Going to stop Gameserver..." 
    $JSVC -stop -pidfile $PIDFILE $CLASS 
    echo "Gameserver stopped!" 
} 

case "$1" in 
    start)   
     start   
     ;; 
    stop) 
     stop 
     ;; 
    restart) 
     stop 
     start 
     ;; 
    *) 
     echo "Usage: /etc/init.d/silvercar-gameserver {start|stop|restart}" 
     exit 1 
     ;; 
esac 
+1

ya conoce el directorio - es/directorio2. –

+0

@Neil Aparte del hecho de que la muestra anterior es, bueno, solo una muestra, lo sé, pero script2 no. –

Respuesta

5

Para obtener el archivo, el script padre obviamente conoce la ruta donde está el script hijo. Configúrelo como una variable, luego en el script secundario verifique esa variable. Si está disponible, sabes que se ha obtenido y puedes usar esa ruta; de lo contrario, utiliza el truco habitual en la pregunta que has vinculado.

# script1.sh 
RESOURCE_DIR=/dir2 
source $RESOURCE_DIR/script2.sh 

# script2.sh 
if [ -z "$RESOURCE_DIR"]; then 
    echo $RESOURCE_DIR 
else 
    echo $(dirname $0) 
fi 
+1

Eso es lo que sé y funciona bastante bien. Me gustaría eliminar esa variable de script1 si es posible, que reducirá su tamaño en aproximadamente un 30%: P –

+0

Superarlo :) En realidad, si eso es el 30% de su script1, entonces probablemente no esté usando 'source' apropiadamente . ¿Por qué el script de envoltura? – Caleb

+0

Actualicé la pregunta con la secuencia de comandos real –

6

Si tiene Bash 3.0 o posterior, puede utilizar BASH_SOURCE para obtener exactamente lo que necesita sin depender del programa de llamada para establecer las variables de entorno para usted. Ver más abajo para ver un ejemplo:

#test.sh 
source some_directory/script2.sh 

#some_directory/script2.sh 
echo $BASH_SOURCE 
echo $(dirname $BASH_SOURCE) 

La salida será:

$ ./test.sh 
some_directory/script2.sh 
some_directory 
Cuestiones relacionadas