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
で呼び出しています。grep
str
file1
したがって、time "$1"
引数なしで呼び出されたコマンドの実行時間が計算されますgrep
。grep
少なくとも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