Получить каталог, в котором находится файл сценария bash - PullRequest
8 голосов
/ 09 июня 2011

Как я могу получить каталог, в котором находится файл сценария bash, когда этот файл сценария включен из другого (что отличает его от этого вопроса )?

/ script1.sh

. /dir2/script2.sh

/ dir2 / script2.sh

# echoes "/dir2"
echo whatevergetsthatdir

Это скрипт, который я пытаюсь "исправить"

/ etc / init.d / silvercar-gameserver (уникально для каждого экземпляра)

#!/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

Ответы [ 2 ]

6 голосов
/ 09 июня 2011

Если у вас 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
5 голосов
/ 09 июня 2011

Чтобы получить исходный файл, родительский скрипт, очевидно, знает путь к дочернему скрипту.Установите его как переменную, затем в дочернем скрипте проверьте эту переменную.Если он доступен, вы знаете, что он был получен, и вы можете использовать этот путь, в противном случае используйте обычный трюк в вопросе, который вы связали.

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...