为什么这个bash-e和-L测试没有捕获这个链接?
我有一个bash脚本,它是幂等的。它会创建符号链接,如果链接已经存在,应该可以 这是摘录为什么这个bash-e和-L测试没有捕获这个链接?,bash,Bash,我有一个bash脚本,它是幂等的。它会创建符号链接,如果链接已经存在,应该可以 这是摘录 L="/var/me/foo" if [[ -e "$L" ]] && ! [[ -L "$L" ]]; then echo "$L exists but is not a link." exit 1; elif [[ -e "$L" ]] && [[ -L "$L" ]]; then e
L="/var/me/foo"
if [[ -e "$L" ]] && ! [[ -L "$L" ]];
then
echo "$L exists but is not a link."
exit 1;
elif [[ -e "$L" ]] && [[ -L "$L" ]];
then
echo "$L exists and is a link."
else
ln -s "/other/place" "$L" ||
{
echo "Could not chown ln -s for $L";
exit 1;
}
fi
根据ls-l
,文件/var/me/foo
已经是指向/other/place
的符号链接
尽管如此,当我运行此脚本时,如果未输入和elif
分支,我们将进入else
并尝试执行ln
,该操作失败,因为文件已经存在
为什么我的测试不起作用?因为你只检查[-L“$L”]
如果[-e“$L”]
为真,并且[-e“$L”]
对于指向不存在的目标的链接返回false,你不会检测到指向不存在的位置的链接
下面的逻辑更全面一些
link=/var/me/foo
dest=/other/place
# because [[ ]] is in use, quotes are not mandatory
if [[ -L $link ]]; then
echo "$link exists as a link, though its target may or may not exist" >&2
elif [[ -e $link ]]; then
echo "$link exists but is not a link" >&2
exit 1
else
ln -s "$dest" "$link" || { echo "yadda yadda" >&2; exit 1; }
fi
您是否可以创建一个可以在临时目录中运行的示例(或者甚至使用mktemp-d
自己创建目录),这样人们就可以复制/粘贴并运行它,而无需更改名称或拥有根权限?另外:/other/place
是否存在?如果应该,请确保您的示例实际创建了它(当然,在您的临时目录下)…此外,如果-e
为真,为什么只检查-L
?…作为旁白:所有caps变量名都由对shell或操作系统有意义的变量使用。考虑为您自己的变量使用小写名称,这些变量保留给应用程序使用,以避免错误地重写一些重要的内容。请参阅--谈到环境变量,但这些约定也适用于常规shell变量,因为设置shell变量会覆盖任何类似命名的环境变量。