gpt4 book ai didi

linux - "mkdir || echo && exit"即使 mkdir 成功退出

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:19:27 31 4
gpt4 key购买 nike

mkdir $2 || echo "I can't create directory $2" && exit 8

大家好,这是我在这里的第一篇文章,请多多关照。

我现在正在制作一个脚本,这一行让我很困扰。

exit 8 只有在无法创建目录 $2 时才会发生。运行脚本并成功创建该目录后,它仍然在 8 退出。

我错过了什么吗?我认为“||”之后的命令只有在左侧出现错误时才会发生。

我是 Linux 世界的新手,作为一个具有中等 C 语言经验的人,我很困惑,求助! (使用 ubuntu、bash、顺便说一句)

最佳答案

正如@fernand0 所建议的,问题在于 ||&& 运算符的优先级。你想让它运行类似 mkdir || 的东西( echo && exit ) -- 也就是说,如果 mkdir 失败,则运行 echo && exit 部分。但它实际做的是运行类似 ( mkdir || echo ) && exit 的东西——也就是说,如果 mkdirecho 命令成功。 echo 几乎总是会成功,所以它几乎总是会退出。

因此,您需要明确地对命令进行分组,以覆盖此优先级。但是不要使用 ( ),因为它在子 shell 中运行它的内容,而 exit 只会退出子 shell,而不是主脚本;您可以改用 { },或使用明确的 if block 。此外,您实际上并不需要 echo && exit,因为只有当 echo 命令成功时才会运行 exitecho 几乎总是成功,但在极少数情况下会失败,我很确定您无论如何都希望脚本退出。

当我需要在脚本中做这样的事情时,我通常使用这个成语:

mkdir "$2" || {
echo "I can't create directory $2" >&2
exit 8
}

(注意:正如@CharlesDuffy 所建议的,我在 $2 周围添加了双引号——双引号变量引用几乎总是一个好主意,以防它们包含任何空格、通配符等。我还将错误消息发送到标准错误 (>&2) 而不是标准输出,这通常也是一种更好的处理方式。)

如果你想更简洁,你可以把它全部放在一行中:

mkdir "$2" || { echo "I can't create directory $2" >&2; exit 8; }

注意最后的;(或换行符)需要在之前,否则shell认为}只是一个参数退出。您也可以换一种方式使用显式的 if block :

if ! mkdir "$2"; then
echo "I can't create directory $2" >&2
exit 8
fi

这个选项不太聪明和简洁,但这是一件好事——聪明和简洁正是导致这个问题的首要原因;清晰明确的代码更好。

关于linux - "mkdir || echo && exit"即使 mkdir 成功退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47241132/

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