1

いくつかのグーグル(私は決してbashの専門家ではありません)から、テストスイートを実行し、実行中に下部にステータスバーを出力できるbashスクリプトをまとめることができました。通常、約 10 時間かかります。ステータス バーには、成功したテストの数と失敗したテストの数が表示されます。

うまく機能することもありますが、無限ループに陥ることもあります。私が使用しているコードは次のとおりです。

#!/bin/bash
WHITE="\033[0m"
GREEN="\033[32m"
RED="\033[31m"

(run_test_suite 2>&1) | tee out.txt |
while IFS=read -r line;
do
    printf "%$(tput cols)s\r" " ";
    printf "%s\n" "$line";

    printf "${WHITE}Passing Tests: ${GREEN}$(grep -c passed out.txt)\t"         2>&1;
    printf "${WHITE}Failed Tests: ${RED}$(   grep -c FAILED out.txt)${WHITE}\r" 2>&1;
done

バグに遭遇すると、エラー メッセージが無限に繰り返され、ログ ファイル ( out.txt) が数メガバイトの巨大なものになります (一度 GB に入ったと思います)。繰り返されるエラーの例を次に示します (各セットの間に 4 行の空白があります)。

warning caused by MY::Custom::Perl::Module::TEST_FUNCTION
print() on closed filehandle GEN3663 at /some/CPAN/Perl/Module.pm line 123.

2>&1リダイレクトを取り出そうとしましたが、に変更しようとしましたwhile IFS=read -r line;while read -r line;、無限ループが発生し続けます。奇妙なことに、これはほとんどの場合に発生するようですが、長いテスト スイートを問題なく終了することもありました。

編集

私がこれを書いている理由は、白黒のテスト スイートから色分けされたテスト スイート (したがって ANSI コード) にアップグレードするためです。以前は、次を使用してテスト スイートを実行していました。

run_test_suite > out.txt 2>&1 &
watch 'grep -c FAILED out.txt; grep -c passed out.txt; tail -20 out.txt'

この方法で実行すると、Perl から同じ警告が表示されますが、無限ループに陥ることなく、ファイルに出力されて先に進みます。watch を使用すると、[32m実際にテキストを緑色でレンダリングするのではなく、次のようなものも印刷されます。

4

2 に答える 2

0

Perl のエラーを修正することができました。bash スクリプトは、いくつかの変更を加えた後、正常に動作するようになりました。ただし、将来そのようなことが起こった場合に備えて、これはテストスイートを実行するためのより安全な方法であるようです:

#!/bin/bash
WHITE="\033[0m"
GREEN="\033[32m"
RED="\033[31m"

run_full_test > out.txt 2>&1 &
tail -f out.txt | while IFS= read line; do
    printf "%$(tput cols)s\r" " ";
    printf "%s\n" "$line";

    printf "${WHITE}Passing Tests: ${GREEN}$(grep -c passed     out.txt)\t"         2>&1;
    printf "${WHITE}Failed Tests: ${RED}$(   grep -c 'FAILED!!' out.txt)${WHITE}\r" 2>&1;
done

これにはいくつかの欠点があります。主に、テストを停止するためにヒットCtrl-Cした場合、停止したように見えますが、実際には run_full_test がまだバックグラウンドで実行されているため、手動で強制終了することを忘れないでください。また、テストが終了しtail -fてもまだ実行中です。つまり、ここでは 2 つのプロセスが実行されており、それらは同期していません。

以下は、これらの問題に対処するためのわずかに修正された元のスクリプトです。

#!/bin/bash
WHITE="\033[0m"
GREEN="\033[32m"
RED="\033[31m"

(run_full_test 2>&1) | tee out.txt | while IFS= read line; do
    printf "%$(tput cols)s\r" " ";
    printf "%s\n" "$line";

    printf "${WHITE}Passing Tests: ${GREEN}$(grep -c passed     out.txt)\t"         2>&1;
    printf "${WHITE}Failed Tests: ${RED}$(   grep -c 'FAILED!!' out.txt)${WHITE}\r" 2>&1;
done
于 2013-02-27T01:08:21.333 に答える
0

バグはスクリプトにあります。これは IO エラーではありません。これは不正な引数エラーです。このエラーは、ハンドルとして指定した変数がハンドルではない場合、または閉じた変数である場合に発生します。

壊れたパイプに書き込むと、プロセスが強制終了されるSIGPIPEか、set toprintで false が返されます。$!EPIPE

于 2013-02-20T22:49:44.267 に答える