1

さまざまな入力ファイルとフラグを使用してクイックソートの実行を大量に実行し、それらをフォーマットされた方法で外部ファイルに出力するスクリプトを作成しています。コンテキストを理解できるように、スクリプトの一部を次に示します。

echo $file 
echo "Naive Pivot"
count=1
while [ $count -lt 4 ]
do
    echo "Run $count"
    count=$(($count+1))
    time ./quicksort -pn -so < $file
    echo
done

通常どおりリダイレクトしようとしました(stdoutから)

time ./quicksort -pn -so < $file > timing.txt

stderr からリダイレクトしようとしました (ただし、間違っている可能性があります)。

time ./quicksort -pn -so < $file 2 >> timing.txt

私も試してみました

/usr/bin/time -p -o timing.txt -a ./quicksort -pn -so < $file

そして、このような標準の stderr 出力セットアップでスクリプトを実行します

./testData.sh > timing.txt 2 > timing.txt

ただし、両方とも、ファイルの前後に配置したエコーコマンドの出力の間ではなく、ファイルの END にすべてのタイミングデータを追加します。そのため、コマンドラインではすべてが順番に出力されますが、出力をファイルに送信するスクリプトを実行しようとすると、すべてのエコーが発生します。

個人的な知識を使い果たしたので、助けが必要です。time コマンド (time または /usr/bin/time) を実行に関連する場所にあるファイルに適切に出力するにはどうすればよいですか? 前もって感謝します。

4

1 に答える 1

3

timebash ビルトインです。/usr/bin/time単純なコマンドライン プログラムです。彼らは異なる治療を必要とします。

まず、あなたがやりたいと思うことは、 とファイルの両方stderrをリダイレクトすることです。stdoutbashでは、&>file(または&>>file追加したい場合)でそれを行うことができます。または、より一般的なソリューションを使用することもできます:>file 2>&1. ( の「標準出力と標準エラーのリダイレクト」を参照してくださいman bash)。

これ/usr/bin/timeは、引数で記述されたプログラムを実行するためのサブシェルを作成し、タイミング情報を に出力する通常のプログラムである で問題なく動作しstderrます。

しかし、実際には構文的にコマンド ラインの一部である bash builtin の場合、dtimeであるコマンド ラインにはリダイレクトが含まれているため、これは機能しません。タイミング情報は、リダイレクトされていないbash 自体に送信されます。必要なものを取得するには、サブシェルで d パイプライン全体を実行する必要があります。timestderrtime

(time ./quicksort -pn -so < $file) &> timing.txt
于 2013-08-21T04:07:04.947 に答える