Bash 함수에 대한 개별 호출을 측정하는 방법~에bash 파일.
다음 명령을 사용하는 프로그램이 있습니다.
eclipse -b col_solve.pl -e "myPred"
이 호출은 일부 정보를 출력하며 그 중 마지막 정보는 SUCCESS 또는 FAIL입니다. 저는 디렉토리에 있는 여러 파일에 대해 호출되는 스크립트를 작성 중입니다. 각 파일에 대해 출력은
- 이름
- 상태(성공 또는 실패)
- 실행하는 데 걸린 (사용자) 시간.
내가 아는 코드는 다음과 같습니다.
나는 이것을 사용하여 상태를 가져옵니다(출력의 마지막 단어 검색).
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
범인은 함수를 호출하는 라인입니다. 나는 그것을 `, {, [, $(, ' 및 "로 둘러싸려고 노력했습니다. 아무것도 작동하지 않습니다...
그것도 가능할까...?
답변1
사용time
핵심 단어외부 명령보다는 키워드를 사용하면 time
단순히 프로그램을 실행하는 대신 함수 호출을 포함한 모든 셸 명령을 실행할 수 있습니다. 다음을 통해 출력 형식을 어느 정도 제어할 수 있습니다.TIMEFORMAT
바꾸다.
TIMEFORMAT=%2U
time run_eclipse_on …
echo "$i::$stat"
그러나 출력은 time
자체 라인에 인쇄됩니다. Bash는 트릭을 허용합니다. TIMEFORMAT
명령 중에 변경을 수행하여 더 많은 내용을 채울 수 있습니다.
time { run_eclipse_on …; TIMEFORMAT="${i//%/%%}::${stat//%/%%}::%2U"; }
출력은 time
표준 오류로 인쇄됩니다. 표준 출력에 필요한 경우 를 사용하면 됩니다 2>&1
. 그러나 이렇게 하면 stderr에 인쇄되는 모든 명령도 리디렉션됩니다. 표준 오류를 보존하려면 다음과 같이 할 수 있습니다.파일 설명자 섞기.
{ time { {
run_eclipse_on …;
TIMEFORMAT=$stat::%2U;
} 2>&3; } 2>&1; } 3>&2
답변2
다음과 같은 것을 원하는 것 같습니다.
#!/bin/bash
for f in "$1"/*; do
time eclipse -b col_solve.pl -e "$f" | tail -n 1
done
다음이 아닌 한 쉘 스크립트에서 함수를 사용하지 마십시오.실제로그것들이 필요하다. 셸 스크립트를 사용하면 다른 도구를 쉽게 조정할 수 있다는 이점이 있습니다. 쉘이 아닌 도구가 작업을 수행하도록 하십시오. 쉘을 사용하여 다른 도구를 함께 묶으십시오.
추가 자료:
답변3
"사용자 시간"과 동일하지는 않지만 경과 시간이 충분하다면 시작 및 종료 시간을 저장하고 함수 호출에서 경과 시간을 계산하는 또 다른 옵션이 있습니다. 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