Linux 自动bash脚本交互

Linux 自动bash脚本交互,linux,bash,shell,Linux,Bash,Shell,我一直在尝试制作一个与程序交互的bash脚本 我需要运行“script1”(程序,即“/script1.sh”),我需要运行“script2”(bash脚本),阅读问题并回答问题,返回“script1” 这是我无法解决的两个脚本之间的实际交互 限制: 不允许使用expect或其他类似函数,它必须在linux shell命令上运行 script1.sh将启动几个随机生成的问题。每个问题都必须正确回答 我尝试过使用一系列技术: /proc/[pid]/fd/0(用于使用stdin,但它似乎只限

我一直在尝试制作一个与程序交互的bash脚本

我需要运行“script1”(程序,即“/script1.sh”),我需要运行“script2”(bash脚本),阅读问题并回答问题,返回“script1”

这是我无法解决的两个脚本之间的实际交互

限制:

  • 不允许使用
    expect
    或其他类似函数,它必须在linux shell命令上运行
  • script1.sh将启动几个随机生成的问题。每个问题都必须正确回答
我尝试过使用一系列技术:

  • /proc/[pid]/fd/0
    (用于使用stdin,但它似乎只限于终端,而不是shell进程本身)
  • 使用netcat设置管道(这是可行的,但让我在交互方面回到原点:阅读和回复)
  • 使用管道(
    /script1.sh)|管道
    ,但这不允许将任何输入返回到“script1”)
  • 使用普通文件进行输入(
    /script1.shquestion.txt
    ,但似乎脚本启动时只读取一次
    answer.txt
  • 使用命名管道(
    /script1.shquestion.pipe
    ,但脚本在开始时会暂停,因为answer.pipe会阻止它。如果我强制使用回车符返回answer.pipe以启动进程,“script1”会失败,因为回车符是错误的答案)
  • 我曾尝试使用后台进程来分解不同的任务(例如,
    /script\u to\u parse\u questions.sh&
    ,然后将结果保存到一个文件中,该文件被读取一次,然后被删除等)
我认为“linux方式”可能是使用管道“|”或括号“”,但可能只有我无法让它正常工作


(为澄清而编辑)

这是您希望使用bash的地方(在bash v4.0中引入--)

假设我们有一个包含问题和答案的文件:

$ cat q_and_a 
Q1
answer one
this is question two
ans 2
question the third
I say thrice
然后“script1”可以阅读此文件,随机提问,并知道正确答案是什么:

$ cat script1.sh 
#!/usr/bin/env bash

# read the q_and_a file
qs=()
as=()
while read -r q; read -r a; do
    qs+=( "$q" )
    as+=( "$a" )
done < q_and_a

# ask the questions in random order
readarray -t order < <(
    printf "%d\n" "${!qs[@]}" | shuf
)

for i in "${order[@]}"; do
    echo "${qs[i]}"
    read -r ans
    if [[ $ans == "${as[i]}" ]]; then
        echo "answer to '${qs[i]}' is CORRECT"
    else
        echo "answer to '${qs[i]}' is WRONG"
    fi
done

可能在您的情况下,您可能没有一个包含问题和答案的共享文件,但是由于script2有问题,您可以做您需要做的事情来分析它并提供适当的答案。

这就是您希望使用bash的地方(在bash v4.0中引入--)

假设我们有一个包含问题和答案的文件:

$ cat q_and_a 
Q1
answer one
this is question two
ans 2
question the third
I say thrice
然后“script1”可以阅读此文件,随机提问,并知道正确答案是什么:

$ cat script1.sh 
#!/usr/bin/env bash

# read the q_and_a file
qs=()
as=()
while read -r q; read -r a; do
    qs+=( "$q" )
    as+=( "$a" )
done < q_and_a

# ask the questions in random order
readarray -t order < <(
    printf "%d\n" "${!qs[@]}" | shuf
)

for i in "${order[@]}"; do
    echo "${qs[i]}"
    read -r ans
    if [[ $ans == "${as[i]}" ]]; then
        echo "answer to '${qs[i]}' is CORRECT"
    else
        echo "answer to '${qs[i]}' is WRONG"
    fi
done

可能在您的情况下,您可能没有包含问题和答案的共享文件,但由于script2有问题,您可以做您需要做的事情来分析它并提供适当的答案。

expect是linux在脚本和任何程序之间进行交互的方式。其他任何与交互有关的东西都会被视为“类似的技术”,所以我不确定你是否被允许。答案总是一样的吗?@glennjackman不,答案是在每次会话中随机生成的。你可以同时更改两个脚本还是只更改其中一个脚本?@kaylum我只能更改“script2.sh”,而不能更改主程序。(Script1)expect是linux在脚本和任何程序之间进行交互的方式。其他任何与交互有关的东西都会被视为“类似的技术”,所以我不确定你是否被允许。答案总是一样的吗?@glennjackman不,答案是在每次会话中随机生成的。你可以同时更改两个脚本还是只更改其中一个脚本?@kaylum我只能更改“script2.sh”,而不能更改主程序。(Script1)“Script1.sh”必须启动,然后“script2.sh”必须能够解释读数并回答此问题。“script1.sh”将提供几个随机生成的问题。如果没有正确解释,我很抱歉。更新我的答案“script1.sh”必须启动,然后“script2.sh”必须能够解释读数并回答此问题。“script1.sh”将提供几个随机生成的问题。我很抱歉,如果这没有得到正确的澄清。更新了我的答案