2011-06-09 3 views
8

Comment puis-je obtenir le répertoire dans lequel se trouve un fichier de script bash, lorsque ce fichier de script est inclus dans un autre (ce qui le rend différent de this question)?Obtenir le répertoire un fichier de script bash est dans

/script1.sh

. /dir2/script2.sh 

/dir2/script2.sh

# echoes "/dir2" 
echo whatevergetsthatdir 

C'est le script que je suis en train de "réparer"

/etc/init.d/s ilvercar-gameserver (unique pour tous les cas)

#!/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 (pas à modifier pour chaque installation. est dans le 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

Vous savez déjà le répertoire - il est/dir2. –

+0

@Neil Mis à part le fait que l'exemple ci-dessus est, eh bien, juste un échantillon, je le sais, mais script2 ne le fait pas. –

Répondre

5

Afin de source le fichier, le script parent connaît évidemment le chemin où le script enfant est. Définissez-le comme une variable, puis dans la vérification du script enfant pour cette variable. Si elle est disponible, vous savez qu'elle a été source et vous pouvez utiliser ce chemin, sinon utilisez l'astuce normale dans la question que vous avez liée.

# 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

C'est ce que je sais et ça marche assez bien. Je voudrais simplement supprimer cette variable de script1 si possible, ce qui réduira sa taille d'environ 30%: P –

+0

Récupérez-le :) En fait, si c'est 30% de votre script1 alors vous n'utilisez probablement pas la source de façon appropriée . Pourquoi le script wrapper? – Caleb

+0

J'ai mis à jour la question avec le vrai script –

6

Si vous avez bash 3.0 ou plus récent, vous pouvez utiliser BASH_SOURCE pour obtenir exactement ce dont vous avez besoin sans compter sur le programme appelant pour définir les variables d'environnement pour vous. Voir ci-dessous pour un exemple:

#test.sh 
source some_directory/script2.sh 

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

La sortie sera:

$ ./test.sh 
some_directory/script2.sh 
some_directory 
Questions connexes