当源自另一个时,ksh脚本如何确定自身的完整路径?

mat*_*ick 6 ksh

当脚本由ksh提供时,脚本如何确定它的路径?即

$ ksh ". foo.sh"
Run Code Online (Sandbox Code Playgroud)

我已经看到在BASH上发布的非常好的方法在stackoverflow和其他地方发布但尚未找到ksh方法.

使用"$ 0"不起作用.这只是指"ksh".

更新:我尝试使用"history"命令,但是不知道当前脚本之外的历史记录.

$ cat k.ksh
#!/bin/ksh
. j.ksh
$ cat j.ksh
#!/bin/ksh
a=$(history | tail -1)
echo $a
$ ./k.ksh
270 ./k.ksh
Run Code Online (Sandbox Code Playgroud)

我希望它回显"*./j.ksh".

Hen*_*eld 6

如果它是AT&T ksh93,则此信息存储在.sh变量中的命名空间中.sh.file.

sourced.sh:

(
 echo "Sourced: ${.sh.file}"
)
Run Code Online (Sandbox Code Playgroud)

调用:

$ ksh -c '. ./sourced.sh'
Run Code Online (Sandbox Code Playgroud)

结果:

Sourced: /var/tmp/sourced.sh
Run Code Online (Sandbox Code Playgroud)

.sh.file变量是来自不同$0.虽然$0可以是ksh/usr/bin/ksh,或当前运行的脚本的名称,.sh.file将始终引用当前范围的文件.

在交互式shell中,此变量甚至不存在:

$ echo ${.sh.file:?}
-ksh: .sh.file: parameter not set
Run Code Online (Sandbox Code Playgroud)


Dim*_*lov 1

我相信唯一的便携式解决方案是覆盖源命令:

source() {
  sourced=$1
  . "$1"
}
Run Code Online (Sandbox Code Playgroud)

然后使用 source 而不是 . (脚本名称将位于 $sourced 中)。