2つの関数の実行時間の比較

2つの関数の実行時間の比較

2つのコマンドを入力として受け取り、2つのコマンドの実行時間を計算し、その時間をテキストファイルに出力する関数を作成しようとしています。読んだ後この投稿、ほとんどのタスクを完了し、実行時間を一度にファイルに書き込むことができます。今経験している問題は、2つのマルチワード入力を許可する関数を取得することです。私の現在のコードは次のとおりです。

timeDiff () {
  { time "$1" ; } 2> ~/file.txt
  { time "$2" ; } 2>> ~/file.txt
}

私が望む機能を使って行を順番に実行すると、すべてが正常です。このファイルは両方の機能のタイミング情報で上書きされます。これに対する私の試みと質問は次のとおりです。

timeDiff grep "str" file1 query database lookup.sql

これは私のファイルにgrepとbash: str: command not found.

timeDiff 'grep "str" file1' 'query database lookup.sql'

これにより、私のファイルが時々表示されることがあります。 bash:grep "str" file1: ファイルまたはディレクトリがなく、bash:query データベース Lookup.sql: ファイルまたはディレクトリがありません。

私の考えでは、これは引用符が必要な私のgrepと関係があると思いますが、おそらく関数に入力を書くより良い方法があるかもしれません。初心者なので学びたいです!ありがとうございます!

答え1

そして:

 { time "$1" ; } 2> ~/file.txt

bashこのようなtimeキーワードを持つシェルの場合、そのtimeキーワードを使用してシェルコードの計算時間を計算できます"$1""$1"関数の最初の位置引数に名前を持つコマンドを実行するコード。

そして:

timeDiff grep "str" file1 query database lookup.sql

最初の引数と2番目の引数(および3番目の引数など)timeDiffで呼び出しています。grepstrfile1

したがって、time "$1"引数なしで呼び出されたコマンドの実行時間が計算されますgrepgrep少なくとも1つのパラメータが必要なので文句を言います。

存在する

timeDiff 'grep "str" file1' 'query database lookup.sql'

今回$1はそうでしょうが、grep "str" file1その名前のコマンドがある可能性はほとんどありません。

あなたが望むのは、次のように、最初と2番目の引数に渡されたシェルコードの評価時間を合わせるようです。

timeDiff () {
  time eval " $1"
  time eval " $2"
} 2> ~/file.txt

または:

timeDiff () {
  eval "time {
    $1
  }"
  eval "time {
    $2
  }
} 2> ~/file.txt

次に構成されるシェルコードを評価します。

time {
  contents-of-$1
}

本体が最初の位置引数の内容であるコマンドグループのタイミングを指定します。

また、次の点に注意してください。

{ time cmd; } 2> file

タイマーは期限切れですがfileエラーが発生しますcmd(およびシェルを実行できないエラーがcmdある場合)。

得るためにただその頃にはfile次のようなものが必要です。

{ time cmd 2>&3 3>&-; } 3>&2 2> file

答え2

timeDiff grep "str" file1 query database lookup.sql

$1=grep と $2=str になります。

timeDiff 'grep "str" file1' 'query database lookup.sql'

$1 を文字列 "grep "str"file1" にして、次の名前のファイルを探します。

./grep_"str"_file1

ここで、_は空白文字です。そのファイルはありません。

バッシュを使用する必要があります評価する関数は文字列を実行可能なコマンドラインステートメントに変換します。

しかし、「評価は悪い」という言葉には理由があるので注意してください:)

関連情報