我可以获取KornShell中当前脚本的绝对path吗?

是否有可能find当前在KornShell(ksh)中执行的脚本的完整path

即如果我的脚本是在/opt/scripts/myscript.ksh ,我可以编程的脚本里面发现/opt/scripts/myscript.ksh

谢谢,

你可以使用:

 ## __SCRIPTNAME - name of the script without the path ## typeset -r __SCRIPTNAME="${0##*/}" ## __SCRIPTDIR - path of the script (as entered by the user!) ## __SCRIPTDIR="${0%/*}" ## __REAL_SCRIPTDIR - path of the script (real path, maybe a link) ## __REAL_SCRIPTDIR=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P ) 

在korn shell中,如果您正在查询脚本,则所有这些$ 0解决方案都会失败。 得到你想要的正确方法是使用$ _

 $ cat bar echo dollar under is $_ echo dollar zero is $0 $ ./bar dollar under is ./bar dollar zero is ./bar $ . ./bar dollar under is bar dollar zero is -ksh 

注意那里的最后一行? 使用$ _。 至少在科恩。 YMMV in bash,csh,et al ..

如何调用脚本存储在变量$ 0中。 您可以使用readlink获取绝对文件名称:

 readlink -f "$0" 

那么,我花了一段时间,但这个是如此简单,尖叫。

 _SCRIPTDIR=$(cd $(dirname $0);echo $PWD) 

因为CD使用$()在派生的shell中运行,所以不会影响当前的脚本。

变量$ RPATH包含真实文件的相对路径或真实文件的真实路径。

 CURPATH=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P ) CURLOC=$CURPATH/`basename $0` if [ `ls -dl $CURLOC |grep -c "^l" 2>/dev/null` -ne 0 ];then ROFFSET=`ls -ld $CURLOC|cut -d ">" -f2 2>/dev/null` RPATH=`ls -ld $CURLOC/$ROFFSET 2>/dev/null` else RPATH=$CURLOC fi echo $RPATH 

这就是我所做的:

 if [[ $0 != "/"* ]]; then DIR=`pwd`/`dirname $0` else DIR=`dirname $0` fi 

readlink -f将是最好的,如果它是可移植的,因为它解决了目录和文件的每个链接。

在Mac OS X中没有readlink -f (除了可能通过macports),所以你只能使用readlink来获取特定符号链接文件的目的地。

$(cd -P ... pwd -P)技术很好,但是只能解析导向脚本的目录的链接,如果脚本本身是符号链接

另外还有一个没有提到的情况:当你通过将一个脚本作为参数传递给一个shell( /bin/sh /path/to/myscript.sh )来启动脚本时, $0在这种情况下是不可用的

我看了看mysql“二进制文件”,其中许多实际上是shell脚本; 现在我明白了他们为什么要求选择一个--basedir或者需要从一个特定的工作目录启动; 这是因为没有很好的解决方案来定位目标脚本

这也是有效的,尽管如果它是一个链接,它不会给“真实”的路径。 这很简单,但不太确切。

 SCRIPT_PATH="$(whence ${0})" 

试试哪个命令。

 which scriptname 

会给你脚本的完整限定名称及其绝对路径

我升级了爱德华·斯陶特的答案,以便能够处理绝对路径的符号链接,也链接链接。

 DZERO=$0 while true; do echo "Trying to find real dir for script $DZERO" CPATH=$( cd -P -- "$(dirname -- "$(command -v -- "$DZERO")")" && pwd -P ) CFILE=$CPATH/`basename $DZERO` if [ `ls -dl $CFILE | grep -c "^l" 2>/dev/null` -eq 0 ];then break fi LNKTO=`ls -ld $CFILE | cut -d ">" -f2 | tr -d " " 2>/dev/null` DZERO=`cd $CPATH ; command -v $LNKTO` done 

丑,但工程…运行后,路径是$ CPATH和文件是$ CFILE

使用$ _提供最后的命令。

 >source my_script 

如果我发出两次命令的作品:

 >source my_script >source my_script 

如果我使用不同的命令序列:

 >who >source my_script 

$ _变量返回“谁”

尝试使用这个:

 dir = $(dirname $0)