`Time` çıkışı ve komut çıkışını aynı boruya nasıl yönlendirebilirim?


24

Farz edeceğim bir ikili dosya var foo.

Çıktısını foobaşka bir işleme yönlendirmek baristersem yazabilirim ./foo | bar.

Öte yandan, eğer ben istedim timefoo ve çıktısını yönlendirmek time, ben yazabilirim time (./foo) | bar.

Sorum şu: Çıktının timesonuna kadar çıktısını nasıl yapıştırabilir foove aynı borunun içinden geçirebilirim ?

Aşağıdaki çözüm aradığım şey değil , çünkü işlemin iki ayrı örneğini başlatırken bar, tek bir paylaşılan boru istiyorum bar.

time (./foo | bar)  | bar

Herkes iki örneğini başlatmak istemeyen nedeni, meraklı kim barçünkü barbir ağ istemcisi olabilir ve ben zamanlama bilgisi aynı bir parçası olarak sunucuya gönderilmesini istediğiniz http POSTişlem çıktısı olarak mesajın.


Burada biraz daha iyi cevap verdi: stackoverflow.com/questions/13356628/…
JDS

Yanıtlar:


29

Ne istediğini anlarsam, bunu yapacağım. Ben komutları ls ~ve teestand-in'leri kullanıyorum ./foove bar, ama istediğin şeyin genel biçimi şudur:

$ ( time ./foo ) |& bar

NOT: çıkışı timezaten herhangi bir çıkışın sonunda eklenmiş, ./foosadece STDERR'de yapılıyor. Boruyu yönlendirmek için STDERR'yi STDOUT ile birleştirmeniz gerekir. Ya |&da kullanabilirsiniz 2>&1.

$ ( time ./foo ) |& bar

-or-

$ ( time ./foo ) 2>&1 | bar

Örnek

$ ( time ls . ) |&  tee cmd.log
cmd.log
file1
file2
file3
file4
file5

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

Ve işte cmd.logüretilen dosyanın içeriği tee.

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

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

Bu sözdiziminin BASH için çalışmadığını unutmayın.
jvriesem

1
@jvriesem tüm örnekler bash'tan geliyor
slm

9

timeçıktısını varsayılan olarak stdout yerine stderr öğesine gönderir. Sadece istediğiniz yere yönlendirmeniz gerekir.

"Öte yandan, eğer yapmak istersem timeve çıktısını yazabilseydim, timeyazabilirdim "time (./foo) | bar diyorsunuz . ama bu aslında yanlıştır. Bu durumda, zamanın çıkışı konsolunuzda görüntülenmeye devam eder, sadece stdout yönlendirilirdi.

Stderr'i özellikle aşağıdakilerle yönlendirebilirsiniz:

(time foo) 2>&1 | bar

veya tüm borular:

(time foo) |& bar

Bunun doğru çalışması için köşeli ayraçlar gerekir.


0

Bunun Solaris'te çalıştığını buldum. (time ls) &> file


1
Bu, varolan çözümlerden hiçbirinden farklı değil
roaima
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.