2

私はbashの使用にかなり慣れておらず、いくつかのテストケースを実行するためのオートグレーダースクリプトを作成しようとしていました。現在、私のbashスクリプトは奇妙に動作しているようです。-eフラグを設定すると、diffのサイズが正の場合にbashが終了し、-eフラグが設定されていない場合、スクリプトはdiffファイルの違いを無視し、すべてのテストに合格したことを示します。

「write_diff_out=....」コマンドの直後にスクリプトが終了し、次の行は出力されません。他のすべてが正常に実行されるため、スクリプトの差分部分のみを含めました(ファイルもすべて存在します)。

# Validate outputs and print results
echo "> Comparing current build's final memory output with golden memory output...";
for file in `ls test_progs`;
do
    file=$(echo $file | cut -d '.' -f1);
    echo "$file";
    write_diff_out=$(diff ./log/$file.writeback.out ./log/$file.writeback.gold.out > ./diff/$file.writeback.diff);
    echo "Finished write_diff";
    program_diff_out=$(diff -u <(grep -E '@@@' ./log/$file.program.out) <(grep -E '@@@' ./log/$file.program.gold.out) > ./diff/$file.program.diff);
    echo "Finished program diff";

    if [ -z "$write_diff_out" ] && [ -z "$program_diff_out" ]; then
        printf "%20s:\e[0;32mPASSED\e[0m\n" "$file";
    else
        printf "%20s:\e[0;31mFAILED\e[0m\n" "$file";
    fi
done
echo "> Done comparing test outputs.";

diffコマンドをフォーマットするより良い方法も自由に提案してください。私はそれらを書くためのさまざまな方法があることを知っています。

4

1 に答える 1

0

何が問題なのか正確にはわかりませんが、いくつかのベストプラクティスに準拠するようにスクリプトを書き直しました。おそらくそれはうまくいくでしょう。

#!/bin/bash

# Debugging mode: prints every command as executed, remove when uneeded
set -x

# Validate outputs and print results
echo "> Comparing current build's final memory output with golden memory output..."

cd test_progs

for file in *; do
    file="$(echo "$file" | sed 's/\.[^.]*$//')"
    echo "$file"

    # will PASS when both diffs return non-zero

    if ! diff "log/$file.writeback.out" \
              "log/$file.writeback.gold.out" > \
              "diff/$file.writeback.diff" && \
       ! diff -u <(grep -E @@@ "log/$file.program.out") \
                 <(grep -E @@@ "log/$file.program.gold.out") > \
                 "diff/$file.program.diff"; then
        printf '%20s:\e[0;32mPASSED\e[0m\n' "$file"
    else
        printf '%20s:\e[0;31mFAILED\e[0m\n' "$file"
    fi
done

echo "> Done comparing test outputs."

lsの解析を回避し、期限が来る場所で引用符を使用し、 [の代わりに[[を使用します([[)内の変数を引用符で囲む必要はありません。また、変数に何かを格納する代わりに、書き込まれたファイルが空かどうかをテストします。

本当にdiffの出力を変数に格納したい場合は、次のようにします。

write_diff_out="$(diff "log/$file.writeback.out" "log/$file.writeback.gold.out" | tee "diff/$file.writeback.diff")"

次に$write_diff_out、ファイルと同じデータが含まれdiff/$file.writeback.diffます。

編集:コメントにあるもののいくつかを実装するために、私の答えを少し編集します。

于 2013-02-15T08:38:11.643 に答える