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

标签 bash shell

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

/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

最佳答案

如果您有 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

关于bash - 获取 bash 脚本文件所在的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6291827/

相关文章:

bash - 使用 UNIX Bash 脚本将文件名中的外来字符替换为等同的英文字符

bash 参数扩展和组合模式匹配运算符

bash - 如何显示名称与 ls 模式匹配的隐藏文件?

regex - 匹配允许有少量差异的单词

linux - 如何修复 bash 脚本未完成 Postgres 命令的问题

bash - 在非登录 shell 中执行的 shebang 中执行 bash 脚本的正确语法是什么

java - 命令行程序延迟到默认文本编辑器

shell - 用于确定循环中相对路径的批处理脚本

linux - 如何在 Linux 中以用户身份为 gfortran 设置环境?

python - Shell脚本不在后台执行所有命令