web-dev-qa-db-ja.com

シェルコマンドの出力でexpect変数を設定する方法

変数bをexpectファイルに設定したいのですが、ここでは最初にこのスクリプトを使用してマシンにsshを実行しました。そのマシンで値をフェッチし、次のコマンドを使用してexpect変数を設定します。

set b [exec `cat /home/a |grep "work"|awk -F '=' '{print $2}'`]


send_user "$b"

ファイル/ home/aの構造は次のとおりです。

home=10.10.10.1

work=10.20.10.1

印刷後に変数bを使用しようとしていますが、sshスクリプトを実行すると次のようになります。

「2」を読み取れません:そのような変数はありません

while executing

この出力をそのマシンのファイル名tempに入れて、次のことを実行しようとすると、次のようになります。

set b [exec cat ./temp]

それからまたそれは与えます:

cat:./ temp:そのようなファイルやディレクトリはありません

「cat./temp」を送信すると、正しい出力が出力されます。

どこが悪いのか教えてください。

8
user2769274

Sshセッション、または同様のものを生成したと仮定すると、send "cat ./temp\r"リモートホスト上のファイルを表示し、exec cat ./tempローカルホスト上のファイルを表示します。 execはプレーンなTclコマンドです。

sendコマンドのコマンド出力をキャプチャすることは、実際のコマンドと出力からの次のプロンプトを解析する必要があるため、PITAのビットです。次のようなことをする必要があります。

# don't need 3 commands when 1 can do all the work
send {awk -F= '/work/ {print $2}' /home/a}
send "\r"
expect -re "awk\[^\n]+\n(.+)\r\n$Prompt"   # where "$Prompt" is a regex that
                                           # matches your Shell Prompt.

set command_output $expect_out(1,string)
send_user "$command_output\n"
4
glenn jackman

一重引用符はTclの引用メカニズムではないため、awk式を区切ります。

% set b [exec cat /home/a | grep "work" | awk -F {=} {{print $2}}]
10.20.10.1

参照:Tclで頻繁に行われる間違い

6
Dinesh