在生成的 rsync 进程上使用等待会在 expect 中停止 rsync

Using wait on spawned rsync process stops rsync in expect

我有一个简单的 expect 脚本可以启动 rsync 进程并发送密码。之后我使用 wait 来捕获 rsync 进程的结果代码:

#!/usr/bin/expect

# check arguments
if { $argc != 3 } {
    puts "Usage $argv0 src dest password"
    exit 1
}

# set arguments
set src [lindex $argv 0]
set dest [lindex $argv 1]
set password [lindex $argv 2]

# call rsync
spawn rsync --delete --exclude=.svn  -rvae ssh $src $dest

# confirm connect question
set timeout 2
expect {
    *connecting* {send "yes\r"}
}

# send password
set timeout 5
expect {
    *assword: {send "$password\r"}
}

# invalid password
set timeout 2
expect {
    *denied* {exit 2}
}

# get process result
lassign [wait] pid spawnid os_error_flag value

# exit with error code
exit $value

问题是在我看到密码提示后 2 秒(可能是在 "invalid password" 块超时之后)rsync 崩溃了。它只是停止传输,甚至 Ctrl-C 也不能再杀死 expect 了。调试证明等待命令导致此行为。在我使用

之前
set timeout -1
expect eof

一切正常。但是那样我无法检索rsync的结果代码。

我的 expect 脚本是否有问题,或者这是 wait 命令或 rsync 中的错误?

您可以在 expect eof 之后 wait。例如:

% cat foo.exp
spawn sh -c "exit 17"
expect eof
set waitResult [wait]
send_user $waitResult\n
% expect foo.exp
spawn sh -c exit 17
29293 exp7 0 17
%