2011-06-09 2 views
8

Bu betik dosyası başka bir'dan (this question'dan farklı kılan) bir bash komut dosyasının bulunduğu dizini, içeri nasıl alabilirim?Dizini bir bash betik dosyası alın

/script1.sh

. /dir2/script2.sh 

/dir2/script2.sh

# echoes "/dir2" 
echo whatevergetsthatdir 

Bu benim

"düzeltmek" çalışıyorum script

/etc/init.d/s ilvercar-gameserver (her örneği için benzersiz)

#!/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 (her yüklemek için değiştirilmesi değil. (svn'de)

# 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

Zaten dizin biliyor - bu/dir2 bu. –

+0

@Neil Yukarıdaki örnek aslında, sadece bir örnek, aslında biliyorum, ama script2 yapmaz. –

cevap

5

Dosyayı kaynaklamak için, üst komut açıkça alt komut dosyasının bulunduğu yolu bilir. Bunu bir değişken olarak ayarlayın, sonra çocuk komut dosyasında bu değişkeni kontrol edin. Eğer mevcutsa, kaynak sağlandığını biliyorsunuz ve bu yolu kullanabilirsiniz, aksi halde bağlandığınız sorudaki normal numarayı kullanın. Eğer bash 3.0 veya daha yeni varsa

# 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

Bu benim bildiğim ve yeterince iyi çalışıyor. Mümkünse bu değişkeni komut dosyasından1 çıkarmak istiyorum. Bu, boyutunu yaklaşık% 30 oranında azaltacaktır: P –

+0

Üstesinden gelin :) Aslında betiğinizin% 30'u buysa, o zaman muhtemelen 'kaynak' kullanmıyorsunuzdur . Neden sarmalayıcı komut dosyası hiç? – Caleb

+0

Soruyu güncel senaryo ile güncelledim –

6

, size sizin için herhangi bir ortam değişkenlerini ayarlamak için çağrı programı dayanmadan şeyi elde etmek BASH_SOURCE kullanabilirsiniz. Örnek için aşağıya bakın:

#test.sh 
source some_directory/script2.sh 

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

çıkışı olacaktır:

$ ./test.sh 
some_directory/script2.sh 
some_directory