当脚本由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".
如果它是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)
我相信唯一的便携式解决方案是覆盖源命令:
source() {
sourced=$1
. "$1"
}
Run Code Online (Sandbox Code Playgroud)
然后使用 source 而不是 . (脚本名称将位于 $sourced 中)。