是否有可能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)