wait
で生成されたプロセスの終了ステータスを取得します コマンド:
expect <<'END'
log_user 0
spawn sh -c {echo hello; exit 42}
expect eof
puts $expect_out(buffer)
lassign [wait] pid spawnid os_error_flag value
if {$os_error_flag == 0} {
puts "exit status: $value"
} else {
puts "errno: $value"
}
END
hello
exit status: 42
予想されるマニュアルページから
<ブロック引用>待って [args]
<ブロック引用>生成されたプロセス (名前が付けられていない場合は現在のプロセス) が終了するまで遅延します。
待って 通常、4 つの整数のリストを返します。最初の整数は、待機していたプロセスの pid です。 2 番目の整数は、対応するスポーン ID です。 3 番目の整数は、オペレーティング システム エラーが発生した場合は -1、それ以外の場合は 0 です。 3 番目の整数が 0 の場合、4 番目の整数は、生成されたプロセスによって返されるステータスです。 3 番目の整数が -1 の場合、4 番目の整数はオペレーティング システムによって設定された errno の値です。グローバル変数 errorCode も設定されます。
変更
expect {
"INVALID " { exit 4 }
timeout { exit 4 }
}
へ
expect {
"INVALID " { exit 4 }
timeout { exit 4 }
eof
}
次に lassign
を追加します そして if
コマンド。
グレンの助けを借りて、私は解決策を得ました..そして私の最終的なスクリプトは::
期待スクリプトは
[Linux Dev:anr ]$ cat testexit.sh
#!/bin/bash
export tmp_script_file="/home/anr/tmp_script_temp.sh"
cp /home/anr/tmp_script $tmp_script_file
chmod a+x $tmp_script_file
cat $tmp_script_file
expect << 'EOF'
set timeout -1
spawn $env(tmp_script_file)
expect {
"INVALID " { exit 4 }
timeout { exit 4 }
eof
}
foreach {pid spawnid os_error_flag value} [wait] break
if {$os_error_flag == 0} {
puts "exit status: $value"
exit $value
} else {
puts "errno: $value"
exit $value
}
EOF
echo "spawned process status" $?
rm -f $tmp_script_file
echo "done"
生成されたスクリプト:
[Linux Dev:anr ]$ cat tmp_script
exit 3
Expect スクリプトの実行:
[Linux Dev:anr ]$ ./testexit.sh
exit 3
spawn /home/anr/tmp_script_temp.sh
exit status: 3
spawned process status 3
done
グレンにもう一度感謝..
予想されるヒアドキュメント内の変数の展開に数日間苦労した後、最終的に、困っている人に役立つと思われる別のアプローチに出会いました。私の要件は、コマンドとパスワードをシェル関数に渡し、リモート ホストでコマンドをヒアドキュメントの期待の一部として実行し、戻り終了コードを取得することでした。
例:
function shell_function {
# Get the command and password as arguments
# Run command using expect
# Return the exit code
}
shell_function <cmd> <password>
echo $?
他のみんなと同じように、ヒアドキュメント内の変数の展開は問題でした。そのためには、値を環境変数にエクスポートし、env
を使用する必要がありました。 ヒアドキュメント内の変数を取得します。パスワードは引数の 1 つであったため、環境変数の一部として保存したくありませんでした。そのため、ヒアドキュメントの開始を一重引用符で囲む代わりに、ヒアドキュメントの変数がエスケープされています。これにより、渡された引数を直接使用できました。
以下は最終的なスクリプトです:
#! /bin/bash
# This function runs a command like 'ssh' and provides the password
function run_with_password {
cmd="$2"
paswd="$1"
expect << END
set timeout 60
spawn $cmd
expect {
"yes/no" { send "yes\r" }
"*assword*" { send -- $paswd\r }
}
expect EOF
catch wait result
exit [lindex \$result 3]
END
}
my_password="AnswerIS42Really?"
cmd_to_run="ssh [email protected]"
cmd_to_run="$cmd_to_run ls .sawfish"
run_with_password $my_password "$cmd_to_run"
echo "Command run code: $?"
上記のコードでは、エスケープされた期待変数は $result
です .変数を \$result
に変更した後 、スクリプトは魔法のように機能し始めました.
以下の質問に答えてくれたユーザーに心から感謝します.
Douglas Leeder:expect スクリプトのヘルプ、リモート comp で cat の実行、変数への出力の取得
グレン・ジャックマン:生成されたプロセスの終了コードを Expect スクリプトで返すには?