首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取bash脚本文件所在的目录

获取bash脚本文件所在的目录
EN

Stack Overflow用户
提问于 2011-06-09 11:09:05
回答 2查看 2.1K关注 0票数 8

当bash脚本文件包含在另一个脚本文件中(这使得它不同于this question)时,如何获得bash脚本文件所在的目录?

/script1.sh

代码语言:javascript
复制
. /dir2/script2.sh

/dir2/script2.sh

代码语言:javascript
复制
# echoes "/dir2"
echo whatevergetsthatdir

这就是我想要“修复”的剧本

/etc/init.d/silvercar-gameserver (每个实例都是唯一的)

代码语言:javascript
复制
#!/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)

代码语言:javascript
复制
# 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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-09 11:12:59

为了源文件,父脚本显然知道子脚本所在的路径。将其设置为变量,然后在子脚本中检查该变量。如果它是可用的,你知道它是来源的,你可以使用这个路径,否则在你所链接的问题中使用正常的技巧。

代码语言:javascript
复制
# 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
票数 5
EN

Stack Overflow用户

发布于 2011-06-09 14:19:53

如果您有bash3.0或更高版本,则可以使用BASH_SOURCE来获得所需的内容,而无需依赖调用程序为您设置任何环境变量。关于一个例子,见下文:

代码语言:javascript
复制
#test.sh
source some_directory/script2.sh

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

产出如下:

代码语言:javascript
复制
$ ./test.sh
some_directory/script2.sh
some_directory
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6291827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档