相当于$ {BASH_SOURCE [1]}的zsh吗?

时间:2019-03-04 04:35:52

标签: shell zsh

我正在尝试获取源脚本的目录,并且一个重要的要求是可以嵌套源,并且最深的脚本源于source <(cat file)之类的东西,因此应在第二个目录中使用最深的文件,使用${BASH_SOURCE[1]}在Bash中很容易做到。知道如何在Zsh中执行相同的操作吗?

更新:

(从下面的评论中)$ {BASH_SOURCE [0]}和$ {BASH_SOURCE [1]}之间的区别在这种情况下非常重要,因为脚本的来源是<(...)和$ { BASH_SOURCE [0]}不是指向实际文件,而是指向临时文件描述符,这就是为什么我需要获取源代码链中第二深的文件。

1 个答案:

答案 0 :(得分:1)

您可以使用funcfiletrace模块定义的zsh/parameter参数。

  

funcfiletrace

     

此数组包含当前功能,源文件或(如果已设置EVAL_LINENO的点的绝对行号和相应的文件名调用了eval命令。

     

该数组与funcsourcetracefunctrace的长度相同,但是与funcsourcetrace的区别在于,行和文件是调用点,而不是定义点,并且与functrace的不同之处在于,所有值都是文件中的绝对行号,而不是相对于函数开始的位置(如果有)。

使用此数组的最后一个元素。

示例

请考虑以下文件结构:

foo
└── bar
    ├── baz
    │   └── baz.zsh
    └── foo.zsh

和文件内容:

foo.zsh

file="$(print -P ${(%):-%x})"
dir="${file:h}"

echo "foo file: $file"
echo "foo directory: $dir"

source <(cat "$dir/baz/baz.zsh")

baz.zsh

zmodload zsh/parameter

file="$funcfiletrace[$#funcfiletrace]"
dir="${file:h}"

echo "foo file from bar: $file"
echo "foo directory from bar: $dir"

结果

% zsh foo/bar/foo.zsh
foo file: foo/bar/foo.zsh
foo directory: foo/bar
foo file from bar: foo/bar/foo.zsh:7
foo directory from bar: foo/bar