2017-09-18 3 views
4

jenkinsでtclコマンドを実行すると、奇妙な問題が発生します。jclinuxから起動されたTclスクリプトは、コマンドを小文字に変換します。

TCLスクリプトは次の行(同上で大文字のIに注意を払う)があります。jekninsで

foreach name $docker_names { 
    set name "TestName" 
    puts $name 
    set command "docker inspect --format='{{.Id}}' ${name} > /home/temp/id.txt" 
    send -- "$command\n" 
    expect "$" 
} 

を、私は2回目の反復で送られているものため、ジョブが失敗したことがわかりログループのは上記のコマンドですが、小文字です。私は、の大文字であるIが必要です。

これは、ループ2回目に送信されるものです:

docker inspect --format='{{.id}}' testname > /home/temp/id.txt 

は注:最初の反復で、すべてが正常に送信されます。

これはなぜ起こっているのですか?

ありがとうございます!

+0

明示的に求められない限り、Tclは文字列の大文字と小文字を変更しません。送信する文字列を取得してから送信する前に明示的にエコーバックされていますか? –

+0

puts "docker inspect --format = '{{Id}}' $ {name}> /home/temp/id.txt"と答えるなら、OKを返します。これは、私がジェンキンズからスクリプトを実行している場合にのみ発生します。 – zephirus

+0

それはあなたが期待していないいくつかのプログラムテキストに変換を適用している何か他にもあるように思えます。悲しいかな、あなたは複雑なソフトウェアスタックを持っていると簡単にやります。一般的には、各言語のスクリプトを独自のファイルに保存するのが最も簡単なので、あなたの日を恐ろしいものにする余分な層はありませんが、それはあなたには役立ちません。 –

答えて

0

純粋なTCLの観点からは起こり得ません。これはJenkinsのTCLインタプリタ統合の副作用です:私は、スクリプトを解析し、非TCL構文に従ってそれを修正する隠れた層があると思います。 まず、文字列F TCLのparsingsを最小限にすることである: 私は2回の試験のだろう

foreach name $docker_names { 
    set name "TestName" 
    puts $name 
    set command [concat {docker inspect --format='{{.Id}}'} $name { > /home/temp/id.txt} "\n"] 
    send -- $command 
    expect "$" 
} 

それが解決しない場合は、別の層によって解釈することができるcurlybraces backquotingしてみてください:

foreach name $docker_names { 
    set name "TestName" 
    puts $name 
    set command "docker inspect --format='\{\{.Id\}\}' ${name} > /home/temp/id.txt" 
    send -- "$command\n" 
    expect "$" 
} 
関連する問題