2017-11-30 4 views
0

私は結果をチームシティー(継続的な統合テスト)に報告するコマンドをカプセル化するbash関数を持っています。私の問題は、!を先読みして結果を無効にできないことです。を使用! bash関数への引数で

function run_as_teamcity_test 
{ 
    local name="$1" 
    shift 
    echo "##teamcity[testStarted name='$name' captureStandardOutput='true']" 
    if ! [email protected]; then 
     ANY_TEST_FAILURE=true 
     FAILED_TESTS="${FAILED_TESTS} ${name}\n" 
     echo "##teamcity[testFailed name='$name']" 
     echo -e "\033[31mTests failed: $name\033[0m" 
    fi 
    echo "##teamcity[testFinished name='$name']" 
} 

これは動作します:

> run_as_teamcity_test "Should be true" echo "OK" 
##teamcity[testStarted name='Should be true' captureStandardOutput='true'] 
OK 
##teamcity[testFinished name='Should be true'] 

これは動作しません:

> run_as_teamcity_test "Should be false" ! echo "Not OK" 
##teamcity[testStarted name='Should be false' captureStandardOutput='true'] 
!: command not found 
##teamcity[testFailed name='Should be false'] 
Tests failed: Should be false 
##teamcity[testFinished name='Should be false'] 

バッシュは、コマンド!探し代わりの組み込みを使用しています。その代わりに組み込み関数を使用する方法はありますか?

+3

[Bashのよくある質問050](http://mywiki.wooledge.org/をBashFAQ/050)が適用されます。 '!'は構文であり、コマンドや引数ではないので、単純に '$ @'の展開の一部として埋め込むことはできません。 – chepner

+0

'' Ok''や '' Not Ok''の単純な文字列チェックをしてみませんか? – Inian

+0

コマンド 'echo" OK "は追加の引数で別のスクリプトを実行するためのプレースホルダです。 – morotspaj

答えて

0

bashにはファーストクラスの機能がないという問題が発生しています。最善のことは、グローバル関数を定義し、その名前を引数として渡すことです。

test_goodtest() { echo "OK"; } 
test_badtest() { ! echo "NOT OK"; } 

run_as_teamcity_test() 
{ 
    local name=$1 
    echo "##teamcity[testStarted name='$name' captureStandardOutput='true']" 
    if ! "$name"; then 
     ANY_TEST_FAILURE=true 
     FAILED_TESTS="${FAILED_TESTS} ${name}\n" 
     echo "##teamcity[testFailed name='$name']" 
     echo -e "\033[31mTests failed: $name\033[0m" 
    fi 
    echo "##teamcity[testFinished name='$name']" 
} 

run_as_teamcity_test test_goodteset 
run_as_teamcity_test test_badtest 

私は、関数の名前は、テストの名前を兼ねることができるという見解を取っているが、あなたが好きなら、あなたはrun_as_teamcity_testに、それぞれに別々の引数を追加することができます。

+0

これは、 'run_as_teamcity_test'の引数に'! 'を使用する問題がどのようになっているのか分かりません。 – morotspaj

+0

構文では、 'echo'の終了ステータスを否定するための唯一の方法は' eval'を使うことです。可能な限り避けることをお勧めします。 (つまり、元のテストを反映するために2つのテスト関数の定義を更新しました) – chepner

+0

引数として単一のコマンド名を渡すのは、 'run_as_teamcity_test'の呼び出し側の責任です。より一般的なシェルコマンドラインです。 – chepner

0

私の代わりに!のヘルパー関数を使用して終了:

function negate 
{ 
    ! "[email protected]" 
} 

そして、このようにそれを使用して:

> run_as_teamcity_test "Should be false" negate echo "Not OK" 
##teamcity[testStarted name='Should be false' captureStandardOutput='true'] 
Not OK 
##teamcity[testFailed name='Should be false'] 
Tests failed: Should be false 
##teamcity[testFinished name='Should be false'] 
関連する問題