Как перенаправить вывод команды времени в файл в Linux?

Просто вопрос о программах синхронизации в Linux: команда времени позволяет измерьте время выполнения программы:

[[email protected] ~]$ time sleep 1

real    0m1.004s
user    0m0.000s
sys     0m0.004s

Что отлично работает. Но если я попытаюсь перенаправить вывод в файл, он терпит неудачу.

[[email protected] ~]$ time sleep 1 > time.txt

real    0m1.004s
user    0m0.001s
sys     0m0.004s

[[email protected] ~]$ cat time.txt 
[[email protected] ~]$ 

Я знаю, что есть другие реализации времени с опцией -o для записи файла, но мой вопрос касается команды без этих параметров.

Любые предложения?

Ответ 1

Try

{ time sleep 1 ; } 2> time.txt

который объединяет STDERR "времени" и вашей команды в time.txt

Или используйте

{ time sleep 1 2> sleep.stderr ; } 2> time.txt

который ставит STDERR из "sleep" в файл "sleep.stderr", и только STDERR от "time" переходит в "time.txt"

Ответ 2

Оберните time и команду, в которой вы указываете время в наборе скобок.

Например, следующие времена ls и записывает результат ls и результаты синхронизации в outfile:

$ (time ls) > outfile 2>&1

Или, если вы хотите отделить вывод команды от захваченного вывода с time:

$ (time ls) > ls_results 2> time_results

Ответ 3

Simple. Утилита GNU time имеет возможность для этого.

Но вы должны убедиться, что вы не используете команду shell builtin time, по крайней мере, встроенный bash не предоставляет эту опцию! Для этого вам необходимо указать полный путь к утилите time:

/usr/bin/time -o time.txt sleep 1

Ответ 4

Если вы заботитесь о выходе ошибки команды, вы можете их разделить так, используя при этом встроенную команду времени.

{ time your_command 2> command.err ; } 2> time.log

или

{ time your_command 2>1 ; } 2> time.log

Как вы видите, ошибки команды идут в файл (поскольку stderr используется для time).

К сожалению, вы не можете отправить его другому дескриптору (например, 3>&2), поскольку он больше не будет существовать вне {...}

Тем не менее, если вы можете использовать время GNU, просто сделайте то, что сказал @Tim Ludwinski.

\time -o time.log command

Ответ 5

Если вы используете время GNU вместо встроенного bash, попробуйте

time -o outfile command

(Примечание. Формат времени GNU немного отличается от встроенного bash).

Ответ 6

Поскольку вывод команды "время" является выходом ошибки, перенаправление его как стандартного вывода было бы более интуитивно понятным для дальнейшей обработки.

{ time sleep 1; } 2>&1 |  cat > time.txt

Ответ 7

&>out time command >/dev/null

в вашем случае

&>out time sleep 1 >/dev/null

затем

cat out

Ответ 8

#!/bin/bash

set -e

_onexit() {
    [[ $TMPD ]] && rm -rf "$TMPD"
}

TMPD="$(mktemp -d)"
trap _onexit EXIT

_time_2() {
    "[email protected]" 2>&3
}

_time_1() {
    time _time_2 "[email protected]"
}

_time() {
    declare time_label="$1"
    shift
    exec 3>&2
    _time_1 "[email protected]" 2>"$TMPD/timing.$time_label"
    echo "time[$time_label]"
    cat "$TMPD/timing.$time_label"
}

_time a _do_something
_time b _do_another_thing
_time c _finish_up

Это имеет смысл не создавать нерегулярные оболочки, а в последнем конвейере stderr восстанавливается до реального stderr.

Ответ 9

Я закончил тем, что использовал:

/usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol
  • Где "a" добавляется
  • Где "o" выполняется по имени файла для добавления к
  • Где "f" - формат с синтаксисом типа printf
  • Где "% E" производит 0:00:00; часы: минуты: секунды
  • Мне пришлось вызывать /usr/bin/time, потому что bash "time" трассировал его и не имеет одинаковых параметров
  • Я просто пытался получить вывод в файл, а не то же самое, что и OP

Ответ 10

Если вы не хотите прикасаться к исходному процессу 'stdout и stderr, вы можете перенаправить stderr на дескриптор файла 3 и обратно:

$ { time { perl -le "print 'foo'; warn 'bar';" 2>&3; }; } 3>&2 2> time.out
foo
bar at -e line 1.
$ cat time.out

real    0m0.009s
user    0m0.004s
sys     0m0.000s

Вы можете использовать это для обертки (например, для cronjob) для мониторинга времени выполнения:

#!/bin/bash

echo "[$(date)]" "[email protected]" >> /my/runtime.log

{ time { "[email protected]" 2>&3; }; } 3>&2 2>> /my/runtime.log

Ответ 11

Если вы используете csh вы можете использовать:

/usr/bin/time --output=outfile -p $SHELL  -c 'your command'

Например:

/usr/bin/time --output=outtime.txt -p csh -c 'cat file'