Як я можу переспрямувати вихідний час та командний вихід на ту саму трубу?


24

Припустимо, у мене є двійковий під назвою foo.

Якщо я хочу перенаправити результат fooна якийсь інший процес bar, я можу написати ./foo | bar.

З іншого боку, якби я хотів timefoo і перенаправляв висновок, timeя міг би написати time (./foo) | bar,.

Моє запитання полягає в тому, як я можу приклеїти результат timeдо кінця виходу fooта прокласти його через ту саму трубу ?

Наступне рішення - це не те, що я шукаю, оскільки воно запускає два окремі екземпляри процесу bar, тоді як я хочу одну спільну трубу, до одного екземпляра bar.

time (./foo | bar)  | bar

Для тих, хто цікавиться, причина того, що не хочуть запускати два екземпляри, barполягає в тому, що він barможе бути мережевим клієнтом, і я хочу, щоб інформація про терміни була надіслана серверу в рамках того ж http POSTповідомлення, що і вихідний процес.


відповів тут, дещо краща відповідь: stackoverflow.com/questions/13356628/…
JDS

Відповіді:


29

Якщо я зрозумію, що ви просите, я це зроблю. Я використовую команди ls ~і teeяк очікування для ./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

Зауважте, що цей синтаксис не працює для BASH.
jvriesem

1
@jvriesem всі приклади з bash
slm

9

timeпосилає свій вихід на stderr замість stdout за замовчуванням. Вам просто потрібно перенаправити те, куди ви цього хочете.

Ви говорите: "З іншого боку, якби я хотів піти timeі перенаправити висновок, timeя міг би написати time (./foo) | bar". але це насправді неправильно. У цьому випадку результат часу все одно відображатиметься на вашій консолі, лише stdout буде переспрямовано.

Ви можете перенаправити stderr спеціально за допомогою:

(time foo) 2>&1 | bar

або всі труби з:

(time foo) |& bar

Для правильної роботи потрібні дужки.


0

Я виявив, що це працює на Solaris. (time ls) &> file


1
Це не відрізняється жодним із існуючих рішень
roaima
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.