Я хочу запустить time
команду, чтобы измерить время нескольких команд.
Что я хочу сделать, это:
- Измерьте время прохождения всех их, сложенных вместе
- Записать
time
вывод в файл - Напишите
STDERR
из команды, которую я измеряюSTDERR
Чего я не хочу делать, так это
- Запишите несколько команд в отдельный скрипт (почему? Потому что все это уже сценарий, который я генерирую программно, и создание ДРУГОГО временного сценария будет более беспорядочным, чем я хочу)
Что я пробовал до сих пор:
/usr/bin/time --output=outtime -p echo "a"; echo "b";
Не работает, time
запускается только на первом.
/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )
Не работает, (
неожиданный токен.
/usr/bin/time --output=outtime -p { echo "a"; echo "b"; }
Не работает, "нет такого файла или каталога".
/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'
Не работает, "нет такого файла или каталога".
time ( echo "a"; echo "b"; ) 2>outtime
Не работает, так как перенаправляет все STDERR
в outtime
; Я хочу только time
вывод там.
И, конечно же,
time --output=outime echo "a";
С тех пор не работает --output=outime: command not found
.
Как я могу это сделать?
источник
time -p sh -c 'echo "a"; echo "b"'
Попробуй это:
Объяснение:
Во-первых, мы должны найти способ перенаправить вывод
time
. Посколькуtime
это встроенная оболочка, в качестве команды для измерения она принимает полную командную строку, включая перенаправления. Таким образом,[Примечание: комментарий janos подразумевает, что это не так
bash
.] Мы можем добиться перенаправленияtime
вывода, запустивtime
в подоболочке оболочку, а затем перенаправив вывод этого подоболочки.Теперь мы успешно перенаправили вывод
time
, но его вывод смешивается с выводом ошибки команды, которую мы измеряем. Чтобы разделить их, мы используем дополнительный файловый дескриптор.На "снаружи" мы имеем
Это означает, что все, что записано в файловый дескриптор 3, будет выведено в то же место, что и файловый дескриптор 2 (стандартная ошибка), который выводится сейчас (терминал). И тогда мы перенаправляем стандартную ошибку в файл
timeout
.Итак, теперь мы имеем: все, что записано в stdout и fd 3, будет отправлено в терминал, а все, что записано в stderr, попадет в файл. Осталось перенаправить stderr измеренной команды на fd 3.
Теперь, чтобы измерить время более чем одной командой, нам нужно запустить их в (другой!) Подоболочке (внутри скобок). И чтобы перенаправить вывод ошибок всех из них в fd 3, нам нужно сгруппировать их в фигурные скобки.
Итак, наконец, мы приходим к:
Вот и все.
источник
Не правильный ответ, но очень связанный с вопросом.
Получить статистику по времени для нескольких программ, объединенных скобок не требуется. Разделяйте команды точкой с запятой.
источник
time ( command1 && command2 )
чтобы в случае неудачи первой команды; он не приступит к выполнению другого.