expect
私のスクリプトには次のものがあります
spawn cat version
expect -re 5.*.*
set VERSION $expect_out(0,string)
spawn rpm --addsign dist/foo-$VERSION-1.i686.rpm
コマンドはcat
バージョンを正しくインポートしていますが、新しい行を追加しているようです。なぜなら、出力は次のようになると予想しているからです。
dist/foo-5.x.x-1.i686.rpm
しかし、最初は次のエラーが発生します。
cannot access file dist/foo-5.x.x
-1.i686.rpm
expect
コマンド出力に新しい行が追加されるのはなぜですかcat
?これを行わないか、catコマンドの出力を変更する方法はありますか?
答え1
TCLは、次の問題なくファイルを直接読み取ることができますspawn cat
。
#!/usr/bin/env expect
# open a (read) filehandle to the "version" file... (will blow up if the file
# is not found)
set fh [open version]
# and this call handily discards the newline for us, and since we only need
# a single line, the first line, we're done.
set VERSION [gets $fh]
# sanity check value read before blindly using it...
if {![regexp {^5\.[0-9]+\.[0-9]+$} $VERSION]} {
error "version does not match 5.x.y"
}
puts "spawn rpm --addsign dist/foo-$VERSION-1.i686.rpm"
答え2
ファイルの末尾に改行がある可能性が高いversion
ので、expect
改行を追加するよりも盲目的に指示に従うのと同じです。 IMHOコマンドを生成する前に期待スクリプトを調整して改行を削除する方が簡単です。削除した後でも、他の編集者がシャットダウン改行を再度入れると、rpm
この質問が再発生しないようにすることができます。
ファイルに終了改行文字がない場合でも、この場合を処理するにはversion
呼び出しを追加することをお勧めします(strip()
もちろん正しい構文に調整されています)。expect
答え3
thrigが言ったように、ファイルを直接読む必要があります。また、cat
Johnが述べたように を使用すると、ファイルの末尾に改行文字が生じ、\r\n
ptyを通過すると(キャリッジリターン、改行)になりますspawn
。したがって、正規表現パターンを変更して次の文字のみをキャプチャできます。
expect -re "(5.*)\r\n"
set VERSION $expect_out(1,string)
()
0(フルパターン一致)ではなくインデックス1(キャプチャ)がどのように必要かを確認してください。
tcl
または、次のコマンドを使用してスペースを削除できます。
set VERSION [string trim $expect_out(0,string)]
予想される行でglobパターンとregexpパターンを混同したことに注意してください。5.*.*
glob パターンは5.xxスタイルを入力してください。使用するということは、-re
正規表現だけを使用して5.*
最後まですべてを一致させる必要があることを意味します。