Shell

如何將“時間”輸出和命令輸出重定向到同一管道?

  • June 19, 2018

假設我有一個名為foo.

如果我想將輸出重定向foo到其他程序bar,我可以寫./foo | bar

另一方面,如果我想timefoo 並重定向time我可以寫的輸出,time (./foo) | bar.

我的問題是,如何將輸出粘貼到輸出time的末尾foo並通過同一管道傳輸?

以下解決方案不是我要尋找的,因為它啟動了程序的兩個單獨實例bar,而我想要一個共享管道到bar.

time (./foo | bar)  | bar

對於任何好奇的人,不想啟動兩個實例的bar原因是因為bar可以是網路客戶端,我希望將計時資訊http POST作為與程序輸出相同的消息的一部分發送到伺服器。

如果我明白你的要求,我會這樣做。我使用命令ls ~andtee作為 and 的替代品./foobar但是你想要的一般形式是這樣的:

$ ( 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.logtee.

$ more cmd.log 
cmd.log
file1
file2
file3
file4
file5

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

引用自:https://unix.stackexchange.com/questions/115980