如何让 bash 默认使用时间二进制文件 (/usr/bin/time) 而不是 shell 关键字?
which time
返回/usr/bin/time
type time
返回time is a shell keyword
运行time
显然是在执行shell关键字:
$ time
real 0m0.000s
user 0m0.000s
sys 0m0.000s
$ /usr/bin/time
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
Run Code Online (Sandbox Code Playgroud)
enable -n time
返回 bash: enable: time: not a shell builtin
假设我有一个名为foo
.
如果我想将 的输出重定向foo
到某个其他进程bar
,我可以编写./foo | bar
.
另一方面,如果我想time
foo 并重定向time
我可以编写的输出,time (./foo) | bar
.
我的问题是,如何将 的输出粘贴到输出time
的末尾foo
并将其通过同一管道输送?
以下解决方案不是我正在寻找的,因为它启动了进程的两个单独实例bar
,而我想要一个共享管道,到bar
.
time (./foo | bar) | bar
Run Code Online (Sandbox Code Playgroud)
对于任何好奇的人,不想启动两个实例的bar
原因是因为bar
可以是网络客户端,并且我希望将计时信息http POST
作为与进程输出相同的消息的一部分发送到服务器。
从Make bash use external `time` 命令而不是 shell built-in,Stéphane Chazelas 写道:
没有
time
内置 bash。time
是一个关键字,所以你可以做例如time { foo; bar; }
我们可以验证一下:
$ type -a time
time is a shell keyword
time is /usr/bin/time
Run Code Online (Sandbox Code Playgroud)
它没有显示time
可以是内置命令。
“关键字”与“Bash 参考手册”中的“保留字”是同一个概念吗?
保留字
一个对壳有特殊意义的词。大多数保留字都引入了 shell 流控制结构,例如
for
和while
。
关键字是否一定不是命令(或不是内置命令)?
作为关键字,是time
不是命令(或不是内置命令)?
根据关键字和内建的定义,为什么time
不是内建而是关键字?
为什么“你可以做例如time { foo; bar; }
”因为“time
是一个关键字”?
time command1 | command2
Run Code Online (Sandbox Code Playgroud)
不time
适用command1
或command1 | command2
?如果你的答案是两者之一,你会如何指定另一个?
您能否根据 bash 的语法或 shell 如何解释命令来解释您的答案?
shell解析命令的时候,time
在识别|
为控制操作符之前是否识别为保留字?识别time
为保留字和识别|
为控制运算符之间的顺序是否决定time
适用于command1
或command1 | command2
?
谢谢。