Измерить каждую команду в файле удара?

Существует ли способ измерить время, проведенное в каждой команде в файле удара? Следовательно, поместите время перед каждой командой. Количество команд неизвестно прямо сейчас, когда я намереваюсь использовать эту меру времени для будущих сценариев удара, также. И также стоящий упоминания то, что я намереваюсь только запустить простые скрипты удара, имеющие command1, command2, command3... и т.д. Следовательно, никакие сложные более высокие логические сценарии.

Позволяет говорят, что у меня есть файл удара, подобный этому:

#!/bin/bash

mv /path/to/file /other/path/
cd /other/path/
tar -xzf /other/path/file

Существует ли способ получить некоторый вывод, подобный этому?

 6.553s   mv /path/to/file /other/path/
 0.057s   cd /other/path/
19.088s   tar -xzf /other/path/file

Я знаю это с time Я мог провести время единственной команды. Но я ищу решение для измерения времени каждой команды самой.

4
задан 12 July 2018 в 12:27

2 ответа

Вы можете использовать /usr/bin/time с опцией -f, как показано в следующем примере. Перед каждой командой в вашем шеллскрипте следует /usr/bin/time -f "%E %C"

$ /usr/bin/time -f "%E %C" sleep 2.34
0:02.34 sleep 2.34

См. man time для более подробной информации.

Пример:

Я создал небольшой скрипт, который может работать для изменения простого простого сценария оболочки путем идентификации команд, которые можно протестировать с помощью /usr/bin/time. Давайте использовать имя time2script.

#!/bin/bash

string='/usr/bin/time -f "%E %C"'

while IFS= read -r line
do
 cmd=$(<<< "$line" sed -e 's/ *//'|cut -d ' ' -f1)
 command=$(which "$cmd")
 if [ "$command" != "" ]
 then
  printf '%s %s\n' "$string" "$line"
 else
  printf '%s\n' "$line"
 fi
done < "$1"

Использование time2script на примере в отредактированном вопросе:

$ ./time2script socrates1
#!/bin/bash

/usr/bin/time -f "%E %C" mv /path/to/file /other/path/
cd /other/path/
/usr/bin/time -f "%E %C" tar -xzf /other/path/file

Перенаправление для создания модифицированного сценария оболочки,

./time2script socrates1 > socrates1-timing
6
ответ дан 1 December 2019 в 09:06

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

#!/bin/bash
# Time each command in another Bash script.

script="$1"

# Skip blank lines and comments.
grep -vE "^\s*($|#)" "$script" |
    while IFS= read -r line
do
    echo "$line"
    time eval "$line"
done

Сценарий в качестве примера foo.sh:

#/bin/bash
true
sleep 2.34

Пример выполняется:

$ bash naive_timer.sh foo.sh
true

real    0m0.000s
user    0m0.000s
sys     0m0.000s
sleep 2.34

real    0m2.342s
user    0m0.000s
sys     0m0.000s

*, например. eval будет дросселировать на многострочных командах, как объявления функции, объявления массива, heredocs, даже многострочные кавычки. И команды, которые полагаются на значение $0 может не работать.

2
ответ дан 1 December 2019 в 09:06

Другие вопросы по тегам:

Похожие вопросы: