LINUX.ORG.RU

/usr/bin/time для последовательности команд

 ,


1

2

Понадобилось померить объём занимаемой памяти и время выполнения последовательности команд, передающих данные через stdout/stdin. Для определённости:

tar -c Dump/ | lzop > dump.tar.lzop

Встроенная в bash команда time меряет только время. /usr/bin/time -v даёт необходимую информацию, но не воспринимает командную строку за | и >.

По команде

/usr/bin/time -v tar -c Dump/ | lzop > dump.tar.lzop
tar и lzop сработают правильно, но time покажет данные только для tar, но не для lzop.

С

/usr/bin/time -v $( tar -c Dump/ | lzop > dump.tar.lzop)
tar и lzop сработают правильно, но time выдаёт Syntax Error.

После

/usr/bin/time -v { tar -c Dump/ | lzop > dump.tar.lzop}
dump.tar.lzop имеет размер 0, time выдаёт время непонятно для чего.

Поправка: надо было писать не $(...) и {...}, а (...) и {...;}, но time с ними всё равно не работает.

Как применить time к последовательности команд, передающих данные через пайпы? Только писать time отдельно для tar и для lzop?

Заранее спасибо.

Ответ:

/usr/bin/time -v bash -c 'tar -c Dump/ | lzop > dump.tar.lzop' 
выдаёт желаемый результат.

А для подстановки переменной лучше всего оказалось ставить

/usr/bin/time -v bash -c 'tar -c '"$somepath"' | lzop > dump.tar.lzop' 

★★★★★

Последнее исправление: question4 (всего исправлений: 2)

/usr/bin/time -v $( tar -c Dump/ | lzop > dump.tar.lzop)

???

{ tar -c Dump/ | lzop > dump.tar.lzop}

Во-первых, compound содержит две синтаксических ошибки (man 1 bash). Во-вторых, работать с внешней командой time всё равно не будет :) Попробуйте использовать скрипт типа

#!/bin/sh
SRC="$1"
DST="$2"
tar -c "$SRC" | lzop > "$DST"
А лучше прочтите man tar — там написано, как использовать внешний компрессор, а lzop вообще поддерживается из коробки (GNU tar).

Homura_Akemi
()
Ответ на: комментарий от Homura_Akemi

Во-первых, compound содержит две синтаксических ошибки

Как правильно его написать, чтобы он работал?

$ перед () поставил по ошибке. С этим уже разобрался.

{} с точкой с запятой, и круглые скобки то есть

/usr/bin/time -v { tar -c Dump/ | lzop > dump.tar.lzop ; }
/usr/bin/time -v ( tar -c Dump/ | lzop > dump.tar.lzop )
выдают синтаксические ошибки bash. Что сделать с компаундом, чтобы time его воспринимало как одну команду?

man tar — там написано, как использовать внешний компрессор

Вопрос был более общий — как использовать для любой последовательности любых команд. Про скрипт не сообразил, спасибо.

А можно ли внутри скрипта задать функцию, и обрабатывать её программой time?

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

Как правильно его написать, чтобы он работал?
{ tar -c Dump/ | lzop > dump.tar.lzop ; }

Да, так правильно.

Вопрос был более общий — как использовать для любой последовательности любых команд.

Думаю, /usr/bin/time любая shell-конструкция безнадёжно поставит в тупик. Так сработает:

/usr/bin/time -v bash -c '{ tar -c Dump/ | lzop > dump.tar.lzop ; }'
Только убедитесь, что время правдоподобное.

А можно ли внутри скрипта задать функцию, и обрабатывать её программой time?

Сомневаюсь, разве что builtin time.

Homura_Akemi
()

/usr/bin/time для последовательности команд

Последовательность команд называется скриптом - вы этого ещё не проходили?

anonymous
()
Ответ на: комментарий от anonymous

Последовательность команд называется скриптом

Как создать скрипт, не записывая его в файл?

question4 ★★★★★
() автор топика
Последнее исправление: question4 (всего исправлений: 1)
Ответ на: комментарий от Homura_Akemi

bash -c '{...;}'

Спасибо. Время выглядит правдоподобно.

question4 ★★★★★
() автор топика
Ответ на: комментарий от aol

(там два минуса)

Пользуйся тегом code

/usr/bin/time -v -- prog1 | prog2 > redir

Не работает. Показывает только время для prog1.

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

Пользуйся тегом

лениво было ради одной строчки ;)

Не работает.

фуцк, действительно....

aol ★★★★★
()
Ответ на: комментарий от marvin_yorke

/usr/bin/time -v bash -c «tar -c Dump/ | lzop > dump.tar.lzop»

Спасибо, выше уже разобрались.

Может приходилось сталкиваться: если, скажем, в параметрах tar вместо Dump/ стоит «$somepath», содержащий пробелы, что с ним сделать, чтобы нормально воспринялось? Более читаемый вариант чем

'tar -c '"$somepath"' | lzop > dump.tar.lzop'
возможен?

question4 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.