为什么这些 bash 命令的执行顺序很重要?

roh*_*rma 10 bash

关于 bash shell,我似乎无法理解一些不一致的地方。

如果我执行:

ls;date;time

三个查询的结果按顺序显示。

但是,在交换日期和时间位置时,会弹出错误消息。

所以如果我执行:

ls;time;date

错误消息说: bash: syntax error near unexpected token 'date'

有人可以解释一下吗?

zwe*_*ets 10

time管道中的命令不是/usr/bin/time二进制文件,而是time内置的 bash 。比较man timehelp time。您看到的错误是 bash 无法解析time的参数。这必须存在或者是换行符。它是您的第一个示例中的换行符,但在第二个示例中不存在。

另一方面,如果你要跑

ls;date;'time'
Run Code Online (Sandbox Code Playgroud)

或者

ls;'time';date
Run Code Online (Sandbox Code Playgroud)

周围的引号'time'撤销其作为保留字的状态,那么 bash 解析该行没有问题。它现在解析列表中的三个命令,它将按顺序执行,并且/usr/bin/time在任何一种情况下都会报告使用错误。

附录

据观察,虽然会time ; date产生错误,time ; ; date但不会。可能的解释是time ;bash将其解释为等效于time <newline>. time ; ; date然后将表达式解析为time ;and的列表date

这与观察结果一致,time ;并且 和time ; ;也是合法的,第二个被解析为单例列表,time ;后跟列表后允许的可选分号。

因此,解释为什么会time ; date产生错误的另一种方法bash: syntax error near unexpected token 'date'time使用分号将其与date. 它只能这样做,因为time它是 bash 保留字。