Bash 中的链接 OR 和 AND

Ani*_*nil 0 bash

我想链接 OR 和 AND 命令,以便在目录存在时将目录的内容打印到标准输出,或者在不存在的情况下,向标准输出打印一条消息,说明目录“$MY_DIR”正在被使用创建然后创建它。

我有以下代码。

ls "$MY_DIR" || echo "Creating $MY_DIR" && mkdir -p "$MY_DIR"
Run Code Online (Sandbox Code Playgroud)

这是正确且规范的方法吗?mkdir始终运行,因为echo将返回0返回状态,即使在返回的情况下也是如此ls

到目前为止,我发现的最相关的问题是这个问题,但它并没有消除我的疑虑。

Sor*_*gal 5

无论如何,我不会做你正在做的事情。如果没有其他原因,为了清晰起见,您应该对命令进行分组。

\n
ls "$MY_DIR" || {\n    echo "Creating $MY_DIR"\n    mkdir -p "$MY_DIR"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这有几个优点:您的意图更清楚地表达,人类认为将发生的事情与计算机将做什么之间的歧义更少,并且它不再依赖于echo您一开始并不真正感兴趣的退出代码。即使您的原始版本完全正确工作,它也更容易受到后来的 na\xc3\xafve 修改。

\n

单行形式当然是可能的,但可读性较差:

\n
ls "$MY_DIR" || { echo "Creating $MY_DIR"; mkdir -p "$MY_DIR"; }\n
Run Code Online (Sandbox Code Playgroud)\n

至于你原来的方法,请考虑:

\n

如果ls命令失败:

\n
false || true && echo mkdir # prints mkdir\n
Run Code Online (Sandbox Code Playgroud)\n

但如果ls命令成功

\n
true || true && echo mkdir # also prints mkdir\n
Run Code Online (Sandbox Code Playgroud)\n

然而

\n
true || { true; echo mkdir; } # does not print\nfalse || { true; echo mkdir; } # prints mkdir\n
Run Code Online (Sandbox Code Playgroud)\n

情况变得更糟:我不完全清楚ls如果文件/目录不存在是否会设置不成功的返回代码。GNU 确实ls这样做了,而且可能很常见,但该标准似乎没有说明什么构成成功或失败,因此实现可能会存在分歧。

\n