这些示例中的每个“time”是关键字还是“/usr/bin/time”?

这些示例中的每个“time”是关键字还是“/usr/bin/time”?

在以下示例中,每个是time关键字还是/usr/bin/time?为什么,或者你如何找到它?

关键字可以是命令吗?

或者关键字是否time适用于空命令? (我可能在帖子或评论中问过这个问题,但我找不到)

谢谢。

$ time time

real    0m0.000s
user    0m0.000s
sys 0m0.000s

$ time

real    0m0.000s
user    0m0.000s
sys 0m0.000s

答案1

在 中time time,both 都是 bash 内置的,none 是外部/usr/bin/time命令。

这是可能的,因为time内置函数将管道作为其参数,但time它本身就是一个管道,因此可以进行多次调用。

如果你查看 bash 源代码,你甚至会发现引用此的注释特例,寻找对time以下另一个time或 的呼叫time -p

您只能看到一次输出,因为time它是由设置位标志,因此多次调用它没有任何效果,因为它只是在该管道上设置相同的位......

然而,这会在两个单独的管道中调用它,因此您会看到两次输出:

$ time { time; }

real    0m0.000s
user    0m0.000s
sys 0m0.000s

real    0m0.000s
user    0m0.000s
sys 0m0.000s

/usr/bin/time您可以通过使用路径显式调用它来查看使用外部的结果...或者使用\time(前导\阻止 shell 使用内置)或使用内置command(如 中所示time command time),例如:

$ time command time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--quiet] [--help] command [arg...]

real    0m0.002s
user    0m0.000s
sys 0m0.000s

/usr/bin/time正如您所看到的,当不带参数调用外部时,外部会抱怨......这就是您所看到的。 (此外,如果您在实际命令中使用它,您会注意到输出格式与 bash 内置的输出格式不同。)

答案2

如果您在第一个示例中只看到一个输出,则这是一个 shell 错误。

在重新实现kshwhere timeis a概念的 shell 中keywordtime不带参数打印整个管道的时间,在这种特殊情况下只是单个time关键字。

如果您调用time time,则第一次打印整个管道的计时,第二次time仅打印其自身的计时。

因此,time单独的关键字确实是空命令之前的关键字。

答案3

可能两者都取决于您的设置。
您可以使用以下命令查看系统上的内容:

$ type time
time is a shell keyword

在您的示例中,两个时间都time time将指向相同的命令。

相关内容