gpt4 book ai didi

bash - 获取脚本目录的 bash 脚本的 zsh 等价物是什么?

转载 作者:行者123 更新时间:2023-12-04 14:36:28 24 4
gpt4 key购买 nike

我想将此 bash 脚本介绍为 zsh 脚本。因此我没有这方面的经验,希望可以在这里得到帮助:

bash脚本:

SCRIPT_PATH="${BASH_SOURCE[0]}";
if([ -h "${SCRIPT_PATH}" ]) then
while([ -h "${SCRIPT_PATH}" ]) do SCRIPT_PATH=`readlink "${SCRIPT_PATH}"`; done
fi
pushd . > /dev/null
cd `dirname ${SCRIPT_PATH}` > /dev/null
SCRIPT_PATH=`pwd`;
popd > /dev/null

我已经知道的是我可以使用 SCRIPT_PATH="$0";获取脚本所在的路径。但是后来我收到了“readlink”语句的错误。

谢谢你的帮助

最佳答案

除了 BASH_SOURCE我认为您不需要进行任何更改。但是脚本的目的是什么?如果你想获取你的脚本所在的目录 ${0:A:h} ( :A 将解析所有符号链接(symbolic link), :h 将截断最后一个路径组件,留下目录名称):

SCRIPT_PATH="${0:A:h}"

就这样。请注意,原始脚本发生了一些奇怪的事情:
  • if(…)while(…)推出 在一个子 shell 中。此处不需要子shell,仅使用 if … 进行这些检查会更快和 while … .
  • pushd .根本不需要。使用时 pushd您通常会更换 cd用它打电话:
    pushd "$(dirname $SCRIPT_PATH)" >/dev/null
    SCRIPT_PATH="$(pwd)"
    popd >/dev/null
  • cd `…`如果 会失败输出带有空格的东西。目录可能包含空格。在上面的例子中,我使用 "$(…)" , "`…`"也会起作用。
  • 您不需要尾随 ;在变量声明中。
  • readlink -f这将解决所有符号链接(symbolic link),因此您可以考虑将原始脚本减少到 SCRIPT_PATH="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" (行为可能会改变,因为您的脚本似乎只在最后一个组件中解析符号链接(symbolic link)):这是 bash 等价于 ${0:A:h} .
  • if [ -h "$SCRIPT_PATH" ]是多余的,因为 while除非脚本路径是符号链接(symbolic link),否则不会执行具有相同条件的正文。
  • readlink $SCRIPT_PATH将返回相对于包含 $SCRIPT_PATH 的目录的符号链接(symbolic link).因此,原始脚本不可能用于解析最后一个组件中的符号链接(symbolic link)。
  • 没有;之间if(…)then .我很惊讶 bash 接受了这一点。

  • 以上所有语句都适用于 bash 和 zsh。

    如果只在最后一个组件中解析符号链接(symbolic link)是必不可少的,你应该这样写:
    SCRIPT_PATH="$0:a"
    function ResolveLastComponent()
    {
    pushd "$1:h" >/dev/null
    local R="$(readlink "$1")"
    R="$R:a"
    popd >/dev/null
    echo $R
    }
    while test -h "$SCRIPT_PATH" ; do
    SCRIPT_PATH="$(ResolveLastComponent "$SCRIPT_PATH")"
    done

    .

    为了说明第 7 条语句,有以下示例:
  • 创建目录 $R/bash ( $R 是任何目录,例如 /tmp )。
  • 将您的脚本不加修改地放在那里,例如名下$R/bash/script_path.bash .添加行 echo "$SCRIPT_PATH"在它的末尾和行 #!/bin/bash在开始测试时。
  • 使其可执行:chmod +x $R/bash/script_path.bash .
  • 创建一个符号链接(symbolic link):cd $R/bash && ln -s script_path.bash link .
  • cd $R
  • 启动 $R/bash/1 .现在您将看到您的脚本输出 $R而它应该输出 $R/bash就像启动时一样 $R/bash/script_path.bash .
  • 关于bash - 获取脚本目录的 bash 脚本的 zsh 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18810483/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com