命令“时间”独立工作但不在管道中

Mat*_*hid 11 bash pipe time

考虑以下:

# time sleep 1

real    0m1.001s
user    0m0.001s
sys     0m0.000s
# echo foo | time sleep 1
bash: time: command not found
Run Code Online (Sandbox Code Playgroud)

嗯……嗯?

好的,很明显,当作为管道运行时,Bash 正在以某种不同的方式搜索命令。谁能向我解释一下有什么区别?管道是否禁用外壳内置程序或其他东西?(我不认为它有......但是......我看不出这是怎么回事。)

Kus*_*nda 20

bash外壳工具time作为关键字。关键字是管道语法的一部分。

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

[time [-p]] [!] command1 [ | or |& command2 ] …
Run Code Online (Sandbox Code Playgroud)

由于timepipelines 语法的一部分,而不是 shell 内置实用程序,因此它不作为实用程序运行。例如,如果没有额外的技巧,就不可能使用普通的 shell 重定向来重定向其输出(参见例如如何将 `time` 输出和命令输出重定向到同一个管道?)。

当这个词time出现在bashshell管道开始之外的任何其他地方时,将调用具有相同名称的外部命令。例如,当您time在管道符号之后放置时,就会发生这种情况。如果 shell 找不到外部time命令,则会生成“未找到命令”错误。

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

echo foo | (time sleep 1)
Run Code Online (Sandbox Code Playgroud)

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

还相关:


归档时间:

查看次数:

838 次

最近记录:

4 年,3 月 前