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

bra*_*ter 22 unix shell scripting ksh path

是否有可能找到当前在KornShell(ksh)中执行的脚本的完整路径?

即如果我的脚本在/opt/scripts/myscript.ksh,我可以编程在该脚本内发现/opt/scripts/myscript.ksh吗?

谢谢,

小智 27

你可以使用:

## __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 )
Run Code Online (Sandbox Code Playgroud)

  • @synthesizerpatel:在ksh93中,你有`$ {.sh.file}`,它也适用于源文件. (5认同)
  • 正如Gruik指出的那样,如果存在指向Shell脚本本身的符号链接,则此方法将无效。因此,如果将命令链接到/ usr / bin中,则__REAL_SCRIPTDIR将返回/ usr / bin,这(很可能)不是您想要的。您显然确实需要为此的readlink (2认同)

小智 9

好吧,我花了一段时间,但这一个是如此简单,它尖叫.

_SCRIPTDIR=$(cd $(dirname $0);echo $PWD)
Run Code Online (Sandbox Code Playgroud)

由于CD在带有$()的衍生shell中运行,因此它不会影响当前脚本.


小智 9

在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
Run Code Online (Sandbox Code Playgroud)

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


sou*_*rge 8

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

readlink -f "$0"
Run Code Online (Sandbox Code Playgroud)

  • `$ 0`是指调用时命令的名称,不需要引用文件系统对象. (3认同)