Answers:
time
管道中的命令不是/usr/bin/time
二进制文件,而是time
内置的bash 。man time
与比较help time
。您看到的错误是bash无法解析time
参数。它必须存在或为换行符。它在您的第一个示例中是换行符,但在第二个示例中不存在。
另一方面,如果您要跑步
ls;date;'time'
要么
ls;'time';date
如果周围的引号'time'
取消了其作为保留字的状态,那么bash解析该行就没有问题。现在,它解析列表中的三个命令,依次执行,并/usr/bin/time
在两种情况下都报告使用错误。
附录
据观察,尽管time ; date
产生错误,time ; ; date
但不会产生错误。可能的解释是time ;
bash 将其解释为等效于time <newline>
。表达time ; ; date
然后被解析为列表time ;
和date
。
这与观察到一致的time ;
和time ; ;
有法律为好,解析为单身列表中的第二个是包含time ;
随后列出了允许后可选的分号。
因此,另一种解释为什么会time ; date
产生错误的方法bash: syntax error near unexpected token 'date'
是,time
使用分号将其与分开date
。它只能这样做,因为time
它是bash保留字。
time
应该允许使用NULL命令,而分号应该对列表进行定界,因此IMO time
命令不应在其后“使用”分号。其他内置命令(可以带参数)不表现出这种行为。
time;date
的确是任何解释语法错误。但是 time ;
,time ; ;
这也将是非法的。它可以进行辩论是否time
的行为是错误或仅仅是无证(这是内部一致),但bug报告肯定会到位。您愿意提出吗?
time by itself can time a null command
,然后由这样做$$ = make_simple_command (x, (COMMAND *)NULL);
。至于提交错误,我不确定8)
time ; date
的作品ksh93
,并mksh
没有任何错误,即使ksh
有time
关键字。
time
当解析命令行时,Bash将内置作为特殊情况处理。
在bash联机帮助页中可以看到,首先将键入的行拆分为一个列表:
pipeline ; pipeline
管道在哪里:
[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]
或者在我们的情况下,只需:
time command
即,如果时间存在,则命令必须也存在。
[有一种特殊情况,允许time
在其后加上换行符,但不适用于此处]
因此,在我们的案例中,我们有:
time;date
被分为两个管道:
1. time
2. date
流水线1的格式不正确,因为我们time
没有命令。因此,错误。
请注意,命令行在time
这里也不起作用:
$ /usr/bin/time;date
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
bash按预期将其解析为2条管道:
1. /usr/bin/time
2. date
并且/usr/bin/time
随后拒绝不带参数运行。请注意,这是错误而/usr/bin/time
不是bash的错误。
反跳标记起作用的原因是反跳标记不再time
被解释为管道中的特殊元素。
即与反-:
`time`;date
它被解析为两个管道:
1. `time`
2. date
请记住,就我们而言,管道是:
[time] command
最初的问题是我们time
没有命令,这是不允许的。但是现在我们只需执行以下命令:
`time`
不带前命令time
,因为反引号意味着将time
其解释为命令,而不是前单词。
因此,bash然后time
不带参数运行其内置函数,这是可以接受的。它不产生任何输出,并且我们看不到任何错误。
注意:
`time`
实际运行结果的time
内置,即它运行无论time
内置的产生在标准输出上。但是由于time
它本身不会向stdout写入任何内容,因此它似乎可以工作。
最后,需要注意的是:
time ; ; date
不幸的是,我无法解释:)
;date
给定bash: syntax error near unexpected token ;
,但是time ;date
给定bash: syntax error near unexpected token date
,因此bash在内置时间之后似乎不将命令视为“; date”。有趣的是,time ; ; date
作品。
'time'
它失去了它作为保留字的含义。反引号使它在子shell中执行,该子shell的输出被拼接到命令中。这与讨论无关。事实上,您的示例`time\';date
证明了与您的主张相反的事实:由于需要论证,因此您的推理应该会出错/usr/bin/time
。之所以没有,是因为在执行它的子shell中,它time
再次是保留字。
time;date
VSdate;time
。这似乎是管道输入bash
和time
输出生成的最后一个char 的问题。在不同的终端仿真器中测试的结果是:-[Bash] $ date; time#[OK] $ time; date#[ NotOK ] bash:语法错误,在意外标记`date'$ time#附近,仅出现错误,表明它不是任何日期的结果。-[Csh] $日期;时间#[OK] $时间;日期#[OK]-[Tcsh] $日期;时间#[OK] $时间;日期#[OK]-[Ksh] $日期;时间#[ OK] $时间;日期#[OK]