Bash 기능에서 시간 사용(명령 아님)

Bash 기능에서 시간 사용(명령 아님)

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

관련 정보