gpt4 book ai didi

bash - 在 proc 内运行 proc 时期望失败

转载 作者:行者123 更新时间:2023-12-04 00:26:14 27 4
gpt4 key购买 nike

使用一个 proc 时,我的脚本工作正常(检索 sftp 提示)。但是当我尝试在 proc 中使用 proc 时,脚本卡住了,我不知道为什么。

请不要重构代码,这不是重点,我需要了解这里的问题。

工作代码:

proc sftp_connect {} {
set times 0;
set connection_retry 2
set timeout 1;
while { $times < $connection_retry } {
spawn sftp ${SFTP_USER}@${SFTP_SERVER}
expect {
timeout { puts "Connection timeout"; exit 1}
default {exit 2}
"*assword:*" {
send "${SFTP_PASSWORD}\n";
expect {
"sftp>" { puts "Connected"; set times [ expr $times+1]; exp_continue}
}
}
}
}
send "quit\r";
}

sftp_connect

调试输出:
expect: does "\r\nsftp> " (spawn_id exp5) match glob pattern "sftp>"? yes

但是在将发送密码移动到单独的 proc 后,expect 不再检索 sftp 提示(“sftp>”):
proc sftp_send_password {} {
send "${SFTP_PASSWORD}\n";
expect {
"sftp>" { puts "Connected"; set times [ expr $times+1]; exp_continue}
}
}

proc sftp_connect {} {
set times 0;
set connection_retry 2
set timeout 1;
while { $times < $connection_retry } {
spawn sftp ${SFTP_USER}@${SFTP_SERVER}
expect {
timeout { puts "Connection timeout"; exit 1}
default {exit 2}
"*assword:*" { sftp_send_password }
}
}
send "quit\r";
}

sftp_connect

调试输出:
expect: does "" (spawn_id exp0) match glob pattern "sftp>"? yes

最佳答案

我手边没有“Exploring Expect”的副本,但我认为您遇到了可变范围的问题。 spawn无形地设置了一个名为 spawn_id 的变量.当您在 proc 中调用 spawn 时,该变量仅适用于该 proc。将其声明为全局:

proc sftp_connect {} {
global spawn_id
# ... rest is the same
}

我认为您不必在 sftp_send_password 中做同样的事情因为expect 有比Tcl 更宽容的范围方案(如果expect 没有找到局部变量,请查看全局命名空间)。

您的 sftp_send_password proc 不会影响 times sftp_connect 中的变量但是,由于相同的变量范围问题。我会推荐

proc sftp_send_password {times_var} {
upvar 1 $times_var times ;# link this var to that in the caller
send "${SFTP_PASSWORD}\n";
expect {
"sftp>" { puts "Connected"; incr times; exp_continue}
}
# note use of `incr` instead of `expr`
}

然后是 sftp_connect proc 发送 times变量 姓名 :
sftp_send_password times

关于bash - 在 proc 内运行 proc 时期望失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30532532/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com