当脚本中存在 BASH_SOURCE[0] 时,如何将 bash 脚本转换为 zsh?

当脚本中存在 BASH_SOURCE[0] 时,如何将 bash 脚本转换为 zsh?

我正在尝试使这个脚本工作,该脚本最初是由我的一位同事为 bash shell 编写的。计划是在 zsh shell 中获取它。据我了解,该脚本允许通过终端访问该目录中保存的帮助程序脚本。然而,当我执行这一步时,我不断收到错误消息。

我尝试过以下一些已回答问题的解决方案,例如替换${BASH_SOURCE[0]}${(%):-%N${(%):-%x}从这里

PATHNAME="$_";

if [[ "$PATHNAME" != "$0" ]]; then
    export EXAMPLE_DIR=$(dirname $(dirname $(realpath ${BASH_SOURCE[0]})));
else
    >&2 echo "This script should be sourced, not executed in a subshell";
fi

我不明白为什么我不断收到错误,我真的很想了解它的问题是什么。任何帮助或阅读链接都非常感谢!

答案1

您收到错误是因为$_Zsh 中的 与 Bash 中的不同。

在重击中

$_(下划线)在 shell 启动时设置为绝对路径名,用于调用在环境或参数列表中传递的正在执行的 shell 或 shell 脚本。随后,扩展至在扩展后在前台执行的上一个简单命令的最后一个参数。还设置为用于调用执行的每个命令并放置在导出到该命令的环境中的完整路径名。检查邮件时,该参数保存邮件文件的名称。

您需要像这样重写该块:

if [[ -z ${(M)zsh_eval_context:#file} ]]; then
  print -u2 $0:A should be sourced, not executed in a subshell.
  return 1
fi
export EXAMPLE_DIR=$0:A:h:h

$zsh_eval_contextfile当直接从文件读取代码时(例如使用内置函数时)将包含该单词source


${(M)zsh_eval_context:#file}$zsh_eval_context如果不包含单词 ,则计算结果为零长度字符串file


print -u2打印到标准错误。


$0是源脚本的文件名。:A(代表“绝对”)将文件名转换为绝对路径,然后将结果传递给realpath(如果可用)来解析符号链接。:h(代表“head”)与 的作用相同dirname,但实际上不需要该外部命令。

相关内容