bash - 使用 expect 使 2 个脚本相互交互自动化

标签 bash shell expect

我有 2 个简单的脚本,我需要它们使用第三个 expect 脚本自动相互交互

script1.sh

#!/bin/bash

echo "s1: started"
echo "question1"
read
echo "got ${REPLY}"
echo "question2"
read
echo "got ${REPLY}"
echo "question3"
read
echo "got ${REPLY}"
echo "s1: finished"

script2.sh

#!/bin/bash

echo "s2: started"
read
echo "got ${REPLY}"
echo "answer1"
read
echo "got ${REPLY}"
echo "answer2"
read
echo "got ${REPLY}"
echo "answer3"
echo "s2: finished"

auto_s1_s2.exp

#!/usr/bin/expect

spawn -noecho ./script1.sh
set s1ID $spawn_id

spawn -noecho ./script2.sh
set s2ID $spawn_id

expect -i $s1ID "question1" {
    send_user "exp: question1\n"
    send -i $s2ID "question1\r"
    expect -i $s2ID "answer1" {
        send_user "exp: answer1\n"
        send -i $s1ID "answer1\r"
    }
}
interact

然而,运行 ./auto_s1_s2.exp 的输出是:

s1: started
question1
exp: question1
question1
s2: started
got question1
answer1
exp: answer1

我期望 s1 回显 question1,它针对 expect $s1ID "question1" 进行验证,然后 expect 脚本将发送 question1s2 并期待 answer1 然后它发送 answers1 等等

Illustration here

似乎 answer1 没有被 script1 接收到

我在这里做错了什么?

最佳答案

这是一个完整的例子。

shell 部分:

[STEP 101] $ cat s1.sh
echo "s1: started"
echo "question1"
read
echo "got ${REPLY}"
echo "question2"
read
echo "got ${REPLY}"
echo "question3"
read
echo "got ${REPLY}"
echo "s1: finished"
[STEP 102] $ cat s2.sh
echo "s2: started"
read
echo "got ${REPLY}"
echo "answer1"
read
echo "got ${REPLY}"
echo "answer2"
read
echo "got ${REPLY}"
echo "answer3"
echo "s2: finished"
[STEP 103] $

期望部分:

[STEP 104] $ cat qa.exp
spawn bash s1.sh
set s1 $spawn_id

spawn bash s2.sh
set s2 $spawn_id

expect -i $s1 "s1: started"
expect -i $s2 "s2: started"

expect {
    -i $s1 -re "(question.)" {
        set q $expect_out(1,string)

        send -i $s2 "$q\r"
        expect -i $s2 -re "got\[^\r\n]+\[\r\n]+"
        expect -i $s2 -re "(\[^\r\n]+)\[\r\n]+$"
        set a $expect_out(1,string)

        send -i $s1 "$a\r"

        exp_continue
    }
    -i $s1 eof {
        exp_continue
    }
    -i $s2 eof {
    }
}

结果:

[STEP 105] $ expect qa.exp
spawn bash s1.sh
spawn bash s2.sh
s1: started
question1
s2: started
question1
got question1
answer1
answer1
got answer1
question2
question2
got question2
answer2
answer2
got answer2
question3
question3
got question3
answer3
s2: finished
s2: finished
got s2: finished
s1: finished
[STEP 106] $

关于bash - 使用 expect 使 2 个脚本相互交互自动化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65771885/

相关文章:

macos - 用于打开新 iTerm 窗口并运行基于变量的命令的 OSX 脚本

html - linux 中是否有一种简单的方法可以从命令行中删除文本网站?

c - 分配二维数组后字符串被截断(已编辑)

c - 如何将 execvp 结果作为字符串存储在 char 数组中

linux - 如何从标准输出和标准错误中删除 ^M

bash - 在 heredoc 中使用 expect 命令

expect - 了解expect脚本shebang中 "-f"标志的用途

Linux 多个 FIND 语句和 IF 条件//bash

Ubuntu 中的 Bash 控制台选项卡完成

linux - ksh脚本+在shell脚本中打印参数内容