是否有可能找到完整的路径脚本,目前正在执行中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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top