这个测试表达式的含义是什么

这个测试表达式的含义是什么

我一直在阅读 test(1)、bash(1) 和 dash(1) 的手册页,但我无法弄清楚这个测试的含义:

[ `echo hi` > /dev/null ]

根据手册页,有两种类型的条件表达式:主要条件表达式和组合条件表达式。组合表达式是由原色组合而成的表达式。

我已经浏览了原选列表,但没有一个与上述表达式的语法匹配。有人可以帮我分解一下吗?

答案1

好的。我是 bash 新手,但是:虽然你的问题很清楚,但我不完全确定我得到你的要求。这也许是不合时宜的。如果是的话请告诉。

TEST IF "echo hi > /dev/null" is success

[ `echo hi` > /dev/null ]
| |   |   | |           |
| |   |   | |           +--- Last test argument
| |   |   | +--------------- Redirect standard out to /dev/null
| |   |   +----------------- Backtick - End Command Substitution
| |   +--------------------- echo hi
| +------------------------- Backtick - Start Command Substitution
+--------------------------- Test

如果回显或重定向失败,则测试失败,否则成功。

当执行命令时,它有一个表示成功、0或错误的退出代码<> 0。因此,如果其中任何一个失败,一切都会失败。

该模式"[ ... ]"与 中不同if (foo == bar),但实际上是一个需要作为最后一个参数[的命令。]

[这也解释了为什么在 and 之前和之后需要空格]

答案2

这与:

[ `echo hi` ] > /dev/null

重定向可能会出现在线路上的任何位置。

正常情况下,与

[ hi ]

它本身与以下相同:

true

该命令不输出任何内容并返回成功退出状态。

如果出现以下情况,结果可能会有所不同:

  • 重定向失败,例如,如果您已达到打开文件的限制或没有写入权限/dev/null(在正常情况下这同样不应该发生)。在这种情况下,shell 将返回一个非零退出状态,您将看到一条错误消息,并且该[命令将不会运行。
  • 命令替换失败(例如,因为您无法再派生任何进程,或者因为已达到文件描述符的最大数量而无法启动管道)。在这种情况下,根据 shell 的不同,可能会发生很多事情,包括 shell 中止。
  • 如果$IFS包含 或hi那么它将解析为(例如对于 IFS=h):[ '' i ],这是无效的并且将导致[返回错误并将退出状态设置为不成功。
  • [如果或echo被重新定义来做其他事情,比如播放音乐或重新启动计算机,可能会发生更奇怪的事情。

总而言之,该命令没有意义,编写的唯一目的可能是让您感到困惑。

相关内容