Bash zsh脚本获得脚本';s目录?
我想把这个bash脚本介绍翻译成zsh脚本。因此,我没有这方面的经验,我希望我能在这里得到帮助: bash脚本:Bash zsh脚本获得脚本';s目录?,bash,zsh,Bash,Zsh,我想把这个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 ${SCR
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_源代码
之外,我看不到您需要做任何更改。但剧本的目的是什么?如果要获取脚本所在的目录,则有${0:A:h}
(:A
将解析所有符号链接,:h
将截断最后一个路径组件,并为您留下目录名):
就这些。请注意,原始脚本有一些奇怪的地方:
if(…)
和而(…)
在子shell中启动…
。这里不需要子shell,只需使用if…
和while…
就可以更快地执行这些检查
pushd.
根本不需要。使用pushd
时,您通常会用它替换cd
调用:
pushd "$(dirname $SCRIPT_PATH)" >/dev/null
SCRIPT_PATH="$(pwd)"
popd >/dev/null
如果输出带有空格的内容,cd```
将失败。目录可能包含一个空格。在上面的示例中,我使用了
“$(…)”
,“`…`
也可以使用
变量声明中的代码>
如果[-h“$SCRIPT\u PATH”]
是冗余的,因为除非脚本路径是符号链接,否则将不会执行具有相同条件的正文
readlink$SCRIPT\u PATH
将返回相对于包含$SCRIPT\u PATH
的目录的符号链接。因此,原始脚本不可能用于解析最后一个组件中的符号链接代码>介于如果(…)
和之间,则。我很惊讶bash接受了这一点
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\u path.bash
下。在其末尾添加行echo“$SCRIPT_PATH”
,并添加行#/bin/bash
在开始测试时chmod+x$R/bash/script\u path.bash
cd$R/bash&&ln-s script\u path.bash链接
cd$R
$R/bash/1
。现在,您将看到脚本输出$R
,而它应该像启动$R/bash/script\u path.bash
时一样输出$R/bash
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