Time “时间”如何通过管道控制其他进程?

Time “时间”如何通过管道控制其他进程?,time,pipe,sh,Time,Pipe,Sh,在一般情况下,我们有一个类似于p | Q | R的命令,它对shell具有以下语义: 创建流程P,Q,R 将P的输出绑定到Q 将Q的输出绑定到R 将P的输出绑定到shell输入 将R的输出绑定到shell输出 运行P,Q,R 我是克里斯托,明白了。但让我们观察以下几点: $ time echo lol | cat | wc -l echo lol 0.00s user 0.00s system 10% cpu 0.005 total cat 0.00s user 0.00s system

在一般情况下,我们有一个类似于
p | Q | R
的命令,它对shell具有以下语义:

  • 创建流程
    P
    Q
    R
  • P
    的输出绑定到
    Q
  • Q
    的输出绑定到
    R
  • P
    的输出绑定到shell输入
  • R
    的输出绑定到shell输出
  • 运行
    P
    Q
    R
我是克里斯托,明白了。但让我们观察以下几点:

$ time echo lol | cat | wc -l
echo lol  0.00s user 0.00s system 10% cpu 0.005 total
cat  0.00s user 0.00s system 81% cpu 0.001 total
wc -l  0.00s user 0.00s system 83% cpu 0.001 total
这里我们有时间,因为它完全了解管道中的所有内容,而从语法的角度来看,我希望它只知道
echo lol
,它将作为子进程启动

如果
time
是一个shell内置,这将很容易做到,但事实并非如此,至少在我的GNU/Linux操作系统上是这样:
哪个time
给了我
/usr/bin/time
,而
bash
手册页没有提到
time
内置


我想不出任何其他节目有类似的特点。
time
程序是否有特殊的例外情况,或者允许这种交互的非常模糊的系统调用?

您为
time echo lol | cat | wc-l
显示的输出确实需要
time
作为shell内置项(实际上比shell内置更为罕见的东西:关键字,如
if
for

在你的调查中有几个缺陷。首先,你不清楚你在使用什么外壳。你的例子中的
time
输出的具体格式是由zsh生成的,它有一个
time
关键字。它在zshmisc(1)中有记录

bash还有一个
time
关键字,但它不会为管道中的每个命令生成单独的输出。在bash手册页中很难找到它,因为他们忽略了将其列在其他关键字中,但在标题“SHELL语法”子标题“管道”下对此进行了解释:

如果时间保留字位于管道之前,则在管道终止时报告其执行所花费的时间以及用户和系统时间。p选项将输出格式更改为POSIX指定的格式。可以将TIMEFORMAT变量设置为格式字符串,以指定定时信息应如何显示显示;请参见下面的Shell变量下的TIMEFORMAT说明

您的另一个错误是使用
哪个
,这显然是您在bash中执行的,在zsh中运行示例
time
命令之后发生的。在zsh中有一个内置的
它可以告诉您关于其他内置的内容。在bash中没有。因此您运行了一个外部命令
,它无法知道您的内置内容您的shell;它只能告诉您在
$PATH
中找到的
时间

有一些zsh内置函数与
which
相关;我喜欢
where
命令,它列出了找到命令的所有位置,而不仅仅是搜索顺序中当前第一个位置。在bash中,您应该使用
type
命令来确定某个对象是否是内置函数

bash$ type time
time is a shell keyword
zsh% where time
time: shell reserved word
/usr/bin/time

注意:这个答案基于bash 4.1.17和zsh 5.0.6,这是我可以轻松测试的版本。如果有某个版本的bash复制了zsh
time
格式,答案会更可信,但据我所知,这还不存在。

您为
time echo l显示的输出ol | cat | wc-l
确实需要
时间
才能成为shell内置(实际上比shell内置更为罕见的东西:一个关键字,比如
if
for

在你的调查中有几个缺陷。首先,你不清楚你在使用什么外壳。你的例子中的
time
输出的具体格式是由zsh生成的,它有一个
time
关键字。它在zshmisc(1)中有记录

bash还有一个
time
关键字,但它不会为管道中的每个命令生成单独的输出。在bash手册页中很难找到它,因为他们忽略了将其列在其他关键字中,但在标题“SHELL语法”子标题“管道”下对此进行了解释:

如果时间保留字位于管道之前,则在管道终止时报告其执行所花费的时间以及用户和系统时间。p选项将输出格式更改为POSIX指定的格式。可以将TIMEFORMAT变量设置为格式字符串,以指定定时信息应如何显示显示;请参见下面的Shell变量下的TIMEFORMAT说明

您的另一个错误是使用
哪个
,这显然是您在bash中执行的,在zsh中运行示例
time
命令之后发生的。在zsh中有一个内置的
它可以告诉您关于其他内置的内容。在bash中没有。因此您运行了一个外部命令
,它无法知道您的内置内容您的shell;它只能告诉您在
$PATH
中找到的
时间

有一些zsh内置函数与
which
相关;我喜欢
where
命令,它列出了找到命令的所有位置,而不仅仅是搜索顺序中当前第一个位置。在bash中,您应该使用
type
命令来确定某个对象是否是内置函数

bash$ type time
time is a shell keyword
zsh% where time
time: shell reserved word
/usr/bin/time
注意:这个答案基于bash 4.1.17和zsh 5.0.6,这两个版本是我可以轻松测试的版本。如果有某个版本的bash复制了zsh
time
格式,那么答案会更可信,但尽可能