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

おすすめ記事