Bash 使用expect向交互式Linux命令发送多个响应

Bash 使用expect向交互式Linux命令发送多个响应,bash,expect,Bash,Expect,我有以下任务要完成 运行linux命令“abc”,它将请求多个响应 首先,有多行,它要求从1-10中选择选项。以“运行”结尾,始终必须选择1 第二,以“是/否”结尾。总是“是”的回答 第三,输入ID。从.txt文件中输入一个ID。每行有一个ID。 第四,是/否。始终选择y作为响应。 步骤2-5应在循环中运行,直到.txt文件中的所有ID都结束,步骤5将选择“否”或退出 在Shell/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}