首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用expect向交互式Linux命令发送多个响应

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

Stack Overflow用户
提问于 2016-09-19 20:22:38
回答 2查看 1.3K关注 0票数 1

我有以下任务要做。

  1. 运行linux命令'abc‘,它将请求多个响应
  2. 首先,有多行,它要求从1-10中选择选项。以“run?”结尾,总是必须选择1
  3. 第二,以“是/否”结尾。总是回答“是”
  4. 第三,输入ID。将一个ID作为.txt文件的输入。每行都有一个ID。
  5. 第四,y/n。总是选择"y“作为响应。

步骤2-5应该在循环中运行,直到.txt文件中的所有ID都结束为止,步骤5将选择'no‘或退出。

在Shell/expect中的代码下面尝试过,但有时它跳过列表中的ID或显示空白值,有时在运行时会崩溃并引发错误:

代码语言:javascript
复制
*child process exited abnormally
    while executing
"exec cat output.txt | grep -i -B2  "rows selected" > result.txt"
    (file "./cmp-test.sh" line 31)*

这里是代码:

代码语言:javascript
复制
exec echo "" > output.txt  
log_file [pwd]/output.txt
set f [open list.txt r]
# list is the file name contain ID's

set idlist [ split [ read $f ] "\n" ]
close $f

send_user "\n Running script.. \n"

spawn <abc command>
foreach ids $idlist {
expect {
  "run? " { send "1\r" }
}

expect {
  "ACDIG: " { send  "$ids\r" }
}

expect { 
  "n)?"  { send "y\r" } 
}

}

exec cat output.txt | grep -i -B2  "rows selected" > result.txt
EN

回答 2

Stack Overflow用户

发布于 2016-09-19 21:10:49

你可能不需要期待这样的结果:

代码语言:javascript
复制
while read -r id; do
abc << "answers"
1
yes
$id
y
answers
done < ids.txt

代码语言:javascript
复制
while read -r id; do
    printf "%s\n" 1 yes "$id" y | abc
done < ids.txt

您之所以获得child process exited abnormally,是因为当grep在其输入中找不到给定的模式时,它会以非零状态退出:这是一个“正常”的grep退出状态,但由于它不是零,Tcl/expect认为出现了错误。

票数 0
EN

Stack Overflow用户

发布于 2016-09-19 21:26:13

尝试将spawn包含在foreach循环中。例如:

代码语言:javascript
复制
#!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中额外的空白不会引起任何问题。

此外,您是否在脚本的末尾关闭log_file进程?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39581491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档