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

関連情報