変数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」を送信すると、正しい出力が出力されます。
どこが悪いのか教えてください。
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"
一重引用符はTcl
の引用メカニズムではないため、awk
式を区切ります。
% set b [exec cat /home/a | grep "work" | awk -F {=} {{print $2}}]
10.20.10.1