我想链接 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?
到目前为止,我发现的最相关的问题是这个问题,但它并没有消除我的疑虑。
无论如何,我不会做你正在做的事情。如果没有其他原因,为了清晰起见,您应该对命令进行分组。
\nls "$MY_DIR" || {\n echo "Creating $MY_DIR"\n mkdir -p "$MY_DIR"\n}\nRun Code Online (Sandbox Code Playgroud)\n这有几个优点:您的意图更清楚地表达,人类认为将发生的事情与计算机将做什么之间的歧义更少,并且它不再依赖于echo您一开始并不真正感兴趣的退出代码。即使您的原始版本完全正确工作,它也更容易受到后来的 na\xc3\xafve 修改。
单行形式当然是可能的,但可读性较差:
\nls "$MY_DIR" || { echo "Creating $MY_DIR"; mkdir -p "$MY_DIR"; }\nRun Code Online (Sandbox Code Playgroud)\n至于你原来的方法,请考虑:
\n如果ls命令失败:
false || true && echo mkdir # prints mkdir\nRun Code Online (Sandbox Code Playgroud)\n但如果ls命令成功
true || true && echo mkdir # also prints mkdir\nRun Code Online (Sandbox Code Playgroud)\n然而
\ntrue || { true; echo mkdir; } # does not print\nfalse || { true; echo mkdir; } # prints mkdir\nRun Code Online (Sandbox Code Playgroud)\n情况变得更糟:我不完全清楚ls如果文件/目录不存在是否会设置不成功的返回代码。GNU 确实ls这样做了,而且可能很常见,但该标准似乎没有说明什么构成成功或失败,因此实现可能会存在分歧。