我正在尝试获取源脚本的目录,并且一个重要的要求是可以嵌套源,并且最深的脚本源于source <(cat file)
之类的东西,因此应在第二个目录中使用最深的文件,使用${BASH_SOURCE[1]}
在Bash中很容易做到。知道如何在Zsh中执行相同的操作吗?
(从下面的评论中)$ {BASH_SOURCE [0]}和$ {BASH_SOURCE [1]}之间的区别在这种情况下非常重要,因为脚本的来源是<(...)和$ { BASH_SOURCE [0]}不是指向实际文件,而是指向临时文件描述符,这就是为什么我需要获取源代码链中第二深的文件。
答案 0 :(得分:1)
您可以使用funcfiletrace
模块定义的zsh/parameter
参数。
funcfiletrace
此数组包含当前功能,源文件或(如果已设置
EVAL_LINENO
的点的绝对行号和相应的文件名调用了eval命令。该数组与
funcsourcetrace
和functrace
的长度相同,但是与funcsourcetrace
的区别在于,行和文件是调用点,而不是定义点,并且与functrace
的不同之处在于,所有值都是文件中的绝对行号,而不是相对于函数开始的位置(如果有)。
使用此数组的最后一个元素。
请考虑以下文件结构:
foo
└── bar
├── baz
│ └── baz.zsh
└── foo.zsh
和文件内容:
file="$(print -P ${(%):-%x})"
dir="${file:h}"
echo "foo file: $file"
echo "foo directory: $dir"
source <(cat "$dir/baz/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