Существует ли способ измерить время, проведенное в каждой команде в файле удара? Следовательно, поместите время перед каждой командой. Количество команд неизвестно прямо сейчас, когда я намереваюсь использовать эту меру времени для будущих сценариев удара, также. И также стоящий упоминания то, что я намереваюсь только запустить простые скрипты удара, имеющие 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
Я мог провести время единственной команды. Но я ищу решение для измерения времени каждой команды самой.
Вы можете использовать /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
Это - наивный подход. Это имеет несколько точек отказа*, таким образом, я не обязательно рекомендую использовать его, просто требуемый для упоминания его.
#!/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
может не работать.