命令“time”单独工作,但不在管道中

命令“time”单独工作,但不在管道中

考虑以下:

# time sleep 1

real    0m1.001s
user    0m0.001s
sys     0m0.000s
# echo foo | time sleep 1
bash: time: command not found

嗯……呃?

好的,那么清楚地当作为管道运行时,Bash 以某种不同的方式搜索命令。谁能向我解释一下有什么区别吗?管道是否会禁用 shell 内置函数或其他东西? (我不认为它确实如此......但是......我看不出这是如何打破的。)

答案1

shell作为关键字bash实现。time关键字是管道语法的一部分。

管道的语法bash是(来自标题为“管道” 在bash手册中):

[time [-p]] [!] command1 [ | or |& command2 ] …

因为time是的一部分管道语法,不是 shell 内置实用程序,它不表现为实用程序。例如,如果没有额外的技巧,使用普通 shell 重定向来重定向其输出是不可能的(参见例如如何将“时间”输出和命令输出重定向到同一管道?)。

当该单词time出现在 shell 中管道开头以外的任何其他位置时bash,将调用具有相同名称的外部命令。time例如,当您将其放在管道符号后面时,就会发生这种情况。如果 shell 找不到外部time命令,则会生成“找不到命令”错误。

要使 shell 使用关键字仅对sleep 1管道中的命令进行计时,您可以使用

echo foo | (time sleep 1)

在管道右侧的子 shell 中,time关键字位于管道的开头(但仍然是单个简单命令的管道)。

还相关:

答案2

您还可以使用/usr/bin/time它也可以为您提供更多详细信息:

echo foo | /usr/bin/time sleep 1

相关内容