Shell
如何將“時間”輸出和命令輸出重定向到同一管道?
假設我有一個名為
foo
.如果我想將輸出重定向
foo
到其他程序bar
,我可以寫./foo | bar
。另一方面,如果我想
time
foo 並重定向time
我可以寫的輸出,time (./foo) | bar
.我的問題是,如何將輸出粘貼到輸出
time
的末尾foo
並通過同一管道傳輸?以下解決方案不是我要尋找的,因為它啟動了程序的兩個單獨實例
bar
,而我想要一個共享管道到bar
.time (./foo | bar) | bar
對於任何好奇的人,不想啟動兩個實例的
bar
原因是因為bar
可以是網路客戶端,我希望將計時資訊http POST
作為與程序輸出相同的消息的一部分發送到伺服器。
如果我明白你的要求,我會這樣做。我使用命令
ls ~
andtee
作為 and 的替代品./foo
,bar
但是你想要的一般形式是這樣的:$ ( time ./foo ) |& bar
**注意:**的輸出
time
已經附加在任何輸出的末尾./foo
,它只是在 STDERR 上完成。要通過管道重定向它,您需要將 STDERR 與 STDOUT 結合起來。您可以使用其中一個|&
或2>&1
這樣做。$ ( time ./foo ) |& bar -or- $ ( time ./foo ) 2>&1 | bar
例子
$ ( time ls . ) |& tee cmd.log cmd.log file1 file2 file3 file4 file5 real 0m0.005s user 0m0.000s sys 0m0.001s
這是
cmd.log
由tee
.$ more cmd.log cmd.log file1 file2 file3 file4 file5 real 0m0.005s user 0m0.000s sys 0m0.001s