Linux 自动bash脚本交互
我一直在尝试制作一个与程序交互的bash脚本 我需要运行“script1”(程序,即“/script1.sh”),我需要运行“script2”(bash脚本),阅读问题并回答问题,返回“script1” 这是我无法解决的两个脚本之间的实际交互 限制: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,但它似乎只限
- 不允许使用
或其他类似函数,它必须在linux shell命令上运行expect
- script1.sh将启动几个随机生成的问题。每个问题都必须正确回答
(用于使用stdin,但它似乎只限于终端,而不是shell进程本身)/proc/[pid]/fd/0
- 使用netcat设置管道(这是可行的,但让我在交互方面回到原点:阅读和回复)
- 使用管道(
,但这不允许将任何输入返回到“script1”)/script1.sh)|管道
- 使用普通文件进行输入(
,但似乎脚本启动时只读取一次/script1.sh
question.txt
)answer.txt
- 使用命名管道(
,但脚本在开始时会暂停,因为answer.pipe会阻止它。如果我强制使用回车符返回answer.pipe以启动进程,“script1”会失败,因为回车符是错误的答案)/script1.sh
question.pipe - 我曾尝试使用后台进程来分解不同的任务(例如,
,然后将结果保存到一个文件中,该文件被读取一次,然后被删除等)/script\u to\u parse\u questions.sh&
(为澄清而编辑)这是您希望使用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”将提供几个随机生成的问题。我很抱歉,如果这没有得到正确的澄清。更新了我的答案