2011-06-09 90 views
8

如何從另一個(它使其與this question不同)中包含該腳本文件時,如何獲取bash腳本文件所在的目錄,獲取bash腳本文件所在的目錄

/script1.sh

. /dir2/script2.sh 

/dir2/script2.sh

# echoes "/dir2" 
echo whatevergetsthatdir 

這是我想 「修理」

腳本

/etc/init.d/s ilvercar-遊戲服務器(獨特的每個實例)

#!/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(不改變對每個安裝。在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

你已經知道的目錄 - 這是/ DIR2。 – 2011-06-09 11:12:59

+0

@Neil除了上面的例子,這只是一個例子,我知道這一點,但腳本2沒有。 – 2011-06-09 11:32:05

回答

5

爲了獲取文件,父腳本顯然知道子腳本所在的路徑。將其設置爲一個變量,然後在子腳本中檢查該變量。如果它是可用的,你知道它已經被採集並且你可以使用該路徑,否則在你鏈接的問題中使用正常的技巧。

# 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

這就是我所知道的,它工作得很好。如果可能的話,我只想從script1中刪除該變量,這會將其大小減少30%:P – 2011-06-09 11:33:11

+0

克服它:)實際上,如果這是腳本1的30%,那麼您可能沒有適當地使用'source' 。爲什麼包裝腳本呢? – Caleb 2011-06-09 11:35:43

+0

我用真正的腳本 – 2011-06-09 11:40:22

6

如果你有bash的3.0或更高版本,可以使用BASH_SOURCE得到你所需要的東西,而不依賴於調用程序設置任何環境變量爲您服務。請參閱下面的例子:

#test.sh 
source some_directory/script2.sh 

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

輸出將是:

$ ./test.sh 
some_directory/script2.sh 
some_directory 
相關問題