关于 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 time有help 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 保留字。