我可以得到绝对的道路向前脚本在KornShell?
题
是否有可能找到完整的路径脚本,目前正在执行中KornShell(股)?
即如果我的剧本是在 /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 )
其他提示
在科恩壳,所有这些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
注意到最后的线路吗?使用$_.至少在科恩.情况因人而异,在庆典,csh,et al..
如何脚本被称为是存在的可变0元。你可以使用 readlink
得到绝对文件的名称:
readlink -f "$0"
很好我花了点时间但是这个是那么简单,它尖叫声。
_SCRIPTDIR=$(cd $(dirname $0);echo $PWD)
由于CD工作在产卵壳美元()它不会影响目前的剧本。
变量$路径包含的相对路径的真实文件的真实的路径一个真正的文件。
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)
技术是好的,但只有工作要解决的链接目录,导致本脚本,它不工作,如果脚本本身就是一个链接
此外,一种情况下,没有提及:当你启动一个脚本通过它作为一个参数的外壳(/bin/sh /path/to/myscript.sh
), $0
不用在这种情况下
我看了看到mysql"二进制文件",其中许多是实际上壳脚本;现在我明白他们为什么要求 --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)