Использование времени для функций bash (не команд)

Как можно измерить отдельные вызовы функций bash изнутри файла bash.

У меня есть программа, которую я вызываю с помощью команды

eclipse -b col_solve.pl -e "myPred" 

Этот вызов выводит некоторую информацию, последним из которых является УСПЕХ или НЕИСПРАВНОСТЬ. Я пишу скрипт, который вызывается на кучу файлов в каталоге, и для каждого из этих файлов выходы

  • Имя
  • Статус (УСПЕХ или НЕИСПРАВНОСТЬ)
  • и время (пользователя), которое потребовалось выполнить.

Это код, который я знаю, работает:

Я использую это для получения статуса (получение последнего слова на выходе):

 stat= get_stat ( ){ stat=$(awk '{print $NF}' <<< $1); } 

Я использую это для вызова программы:

 run_eclipse_on ( ){ get_stat "$(eclipse -b col_solve.pl -e "run(\"$1\")" )"; } 

Проблемный код следующий:

 for i in `ls $1` ; #where $1 is the directory containing the files do tps=$(/usr/bin/time -f %U \ #to get just the user time [run_eclipse_on $1/$i] ); # HERE it is! echo $i::$stat::::$tps; # gives, for ex: file_name::SUCCESS::::0.20 done 

Лицом виновника называется функция. Я попытался окружить его `, {, [, $ (, 'и". Ничего не работало …

Возможно ли это …?

3 Solutions collect form web for “Использование времени для функций bash (не команд)”

Используйте ключевое слово time вместо внешней команды. Использование ключевого слова позволяет вам запускать time в любой команде оболочки, включая вызовы функций, а не только при запуске программы. Вы можете контролировать формат вывода в некоторой степени через переменную TIMEFORMAT .

 TIMEFORMAT=%2U time run_eclipse_on … echo "$i::$stat" 

Однако выход time печатается на собственной линии. Bash позволяет получить трюк: вы можете изменить TIMEFORMAT во время команды, чтобы вы могли TIMEFORMAT больше вещей.

 time { run_eclipse_on …; TIMEFORMAT="${i//%/%%}::${stat//%/%%}::%2U"; } 

Выходной сигнал от time печатается до стандартной ошибки. Если вам это нужно на стандартном выходе, просто переадресовывайте с помощью 2>&1 . Тем не менее, это также перенаправляет все команды, напечатанные на stderr. Чтобы сохранить stderr, вы можете перетащить дескриптор файла .

 { time { { run_eclipse_on …; TIMEFORMAT=$stat::%2U; } 2>&3; } 2>&1; } 3>&2 

Похоже, вы хотите что-то вроде этого:

 #!/bin/bash for f in "$1"/*; do time eclipse -b col_solve.pl -e "$f" | tail -n 1 done 

Не используйте функции в сценариях оболочки, если они вам не нужны. Преимущество использования сценариев оболочки вообще заключается в том, что вы можете легко организовать другие инструменты. Пусть инструменты выполняют работу, а не оболочку. Просто используйте оболочку, чтобы объединить другие инструменты.

Дальнейшее чтение:

  • В Bash, когда к псевдониму, когда скрипту, а когда писать функцию?

Хотя это не то же самое, что «пользовательское время», если истекшее время будет достаточным, другой вариант – сохранить время начала и окончания и вычислить время, прошедшее с момента вызова функции. Функция timer перечисленная здесь, облегчает это.

Воспроизведение функции здесь для упрощения ссылки:

 # Elapsed time. Usage: # # t=$(timer) # ... # do something # printf 'Elapsed time: %s\n' $(timer $t) # ===> Elapsed time: 0:01:12 # # ##################################################################### # If called with no arguments a new timer is returned. # If called with arguments the first is used as a timer # value and the elapsed time is returned in the form HH:MM:SS. # function timer() { if [[ $# -eq 0 ]]; then echo $(date '+%s') else local stime=$1 etime=$(date '+%s') if [[ -z "$stime" ]]; then stime=$etime; fi dt=$((etime - stime)) ds=$((dt % 60)) dm=$(((dt / 60) % 60)) dh=$((dt / 3600)) printf '%d:%02d:%02d' $dh $dm $ds fi } 

В вашем случае вы должны включить эту функцию, а затем:

 for i in * do t=$(timer) run_eclipse_on $i elapsed=$(timer $t) echo $i::$stat::::$elapsed # gives, for ex: file_name::SUCCESS::::0:00:03 done 
  • Выполнение функции скрипта Bash с помощью Sudo
  • Как напечатать код функции оболочки в терминале?
  • Сохранить возвращаемое значение из функции в одном из своих параметров
  • Как эмулировать возвращаемые произвольные значения из функций оболочки?
  • Как создать функцию, которая может сортировать массив в bash?
  • Каковы команды для поиска ключевых слов оболочки, встроенных функций и пользовательских функций?
  • как предотвратить расширение псевдонимов `eval` до произвольного псевдонима и сохранить бесконечную защиту цикла от функции?
  • как я могу использовать sudo внутри функции?
  • Ошибка сегментации при вызове рекурсивной функции bash
  • bash: синтаксическая ошибка возле неожиданного токена
  • Какие оболочки имеют функции, где «local» не изменяет экспортированные переменные для дочерних процессов?
  • Linux и Unix - лучшая ОС в мире.