考虑以下:
# 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