Bash 使用expect向交互式Linux命令发送多个响应
我有以下任务要完成 运行linux命令“abc”,它将请求多个响应 首先,有多行,它要求从1-10中选择选项。以“运行”结尾,始终必须选择1 第二,以“是/否”结尾。总是“是”的回答 第三,输入ID。从.txt文件中输入一个ID。每行有一个ID。 第四,是/否。始终选择y作为响应。 步骤2-5应在循环中运行,直到.txt文件中的所有ID都结束,步骤5将选择“否”或退出 在Shell/expect中尝试了以下代码,但有时会跳过 列出或显示空白值,有时在运行和 抛出错误: 代码如下:Bash 使用expect向交互式Linux命令发送多个响应,bash,expect,Bash,Expect,我有以下任务要完成 运行linux命令“abc”,它将请求多个响应 首先,有多行,它要求从1-10中选择选项。以“运行”结尾,始终必须选择1 第二,以“是/否”结尾。总是“是”的回答 第三,输入ID。从.txt文件中输入一个ID。每行有一个ID。 第四,是/否。始终选择y作为响应。 步骤2-5应在循环中运行,直到.txt文件中的所有ID都结束,步骤5将选择“否”或退出 在Shell/expect中尝试了以下代码,但有时会跳过 列出或显示空白值,有时在运行和 抛出错误: 代码如下: 您可能不需要对
您可能不需要对此进行预期:
while read -r id; do
abc << "answers"
1
yes
$id
y
answers
done < ids.txt
或
您正在使子进程异常退出,因为当grep在其输入中找不到给定模式时,它以非零状态退出:这是正常的grep退出状态,但由于它是非零状态,Tcl/expect认为发生了错误。您可能不需要expect:
while read -r id; do
abc << "answers"
1
yes
$id
y
answers
done < ids.txt
或
您正在使子进程异常退出,因为当grep在其输入中找不到给定模式时,它以非零状态退出:这是正常的grep退出状态,但由于它是非零状态,Tcl/expect认为发生了错误。尝试在foreach循环中包含spawn。例如:
#!usr/bin/expect
exec echo "" > output.txt
log_file -a output.txt
set f [open list.txt r]
set idlist [read $f]
close $f
send_user "\n Running script.. \n"
foreach ids $idlist {
spawn <abc command>
expect "run? "
send "1\r"
expect "ACDIG: "
send "$ids\r"
expect "n)?"
send "y\r"
}
log_file
catch {exec cat output.txt | grep -i -B2 "rows selected" > result.txt}
希望第二个expect中的额外空白不会引起任何问题
此外,是否在脚本结束时关闭日志文件进程?尝试在foreach循环中包含spawn。例如:
#!usr/bin/expect
exec echo "" > output.txt
log_file -a output.txt
set f [open list.txt r]
set idlist [read $f]
close $f
send_user "\n Running script.. \n"
foreach ids $idlist {
spawn <abc command>
expect "run? "
send "1\r"
expect "ACDIG: "
send "$ids\r"
expect "n)?"
send "y\r"
}
log_file
catch {exec cat output.txt | grep -i -B2 "rows selected" > result.txt}
希望第二个expect中的额外空白不会引起任何问题
此外,您是否在脚本结束时关闭日志文件进程?@anujtyagi以下是脚本的其余部分。我很确定read会通过换行自动拆分输入文件,所以拆分几乎是多余的。顺便说一下,我添加了一个catch命令,只是为了消除那个恼人的grep错误…@anujtyagi这是脚本的其余部分。我很确定read会通过换行自动拆分输入文件,所以拆分几乎是多余的。顺便说一下,我添加了一个catch命令,只是为了消除那个恼人的grep错误。。。
#!usr/bin/expect
exec echo "" > output.txt
log_file -a output.txt
set f [open list.txt r]
set idlist [read $f]
close $f
send_user "\n Running script.. \n"
foreach ids $idlist {
spawn <abc command>
expect "run? "
send "1\r"
expect "ACDIG: "
send "$ids\r"
expect "n)?"
send "y\r"
}
log_file
catch {exec cat output.txt | grep -i -B2 "rows selected" > result.txt}