gpt4 book ai didi

bash - bash 中的 IPC(使用命名管道,不使用 expect)

转载 作者:行者123 更新时间:2023-11-29 09:13:56 26 4
gpt4 key购买 nike

我正在编写一个应该与现有 (perl) 程序交互(交互)的 bash 脚本。不幸的是,我无法触及现有的 perl 程序,也无法使用 expect .

目前该脚本按照这个 stackoverflow 答案 Is it possible to make a bash shell script interact with another command line program? 的方式工作

问题是(阅读:似乎是)perl 程序并不总是发送 <newline>在要求输入之前。这意味着 bash 的 while ... read在命名管道上不会“获取”(读取:显示)perl 程序的输出,因为它一直在等待更多。至少我是这么理解的。

基本上 perl 程序正在等待输入,但用户不知道,因为屏幕上没有任何内容。

所以我在 bash 脚本中所做的是关于

#!/bin/bash

mkfifo $readpipe
mkfifo $writepipe

[call perl program] < $writepipe &> $readpipe &
exec {FDW}>$writepipe
exec {FDR}<$readpipe

...

while IFS= read -r L
do
echo "$L"
done < $readpipe

这行得通,除非 perl 程序正在做类似的事情

print "\n";
print "Choose action:\n";
print "[A]: Action A [B]: Action B\n";
print " [C]: cancel\n";
print " ? ";
print "[C] ";
local $SIG{INT} = 'IGNORE';
$userin = <STDIN> || ''; chomp $userin;
print "\n";

然后 bash 脚本只会“看到”

Choose action:
[A]: Action A [B]: Action B
[C]: cancel

但不是

    ? [C]

这不是最有问题的情况,而是最容易描述的情况。

有没有办法确保 ? [C]也打印出来了(我试过 cat <$readpipe & 但那并没有真正起作用)?

或者是否有更好的方法(考虑到我不能修改 perl 程序的限制我也不能使用 expect)?

最佳答案

使用read -N1

让我们尝试以下示例:与发送提示(不以换行结束)的程序交互,我们的系统必须发送一些命令,接收发送的命令的回显。即子进程的总输出为:

$ cat example 
prompt> command1
prompt> command2

脚本可以是:

#!/bin/bash 
#

cat example | while IFS=$'\0' read -N1 c; do
case "$c" in
">")
echo "received prompt: $buf"
# here, sent some command
buf=""
;;
*)
if [ "$c" == $'\n' ]; then
echo "received command: $buf"
# here, process the command echo
buf=""
else
buf="$buf$c"
fi
;;
esac
done

产生以下输出:

received prompt: prompt
received command: command1
received prompt: prompt
received command: command2

第二个例子更接近原始问题:

$猫例子

Choose action:
[A]: Action A [B]: Action B
[C]: cancel
? [C]

脚本现在是:

#!/bin/bash 
#

while IFS=$'\0' read -N1 c; do
case "$c" in
'?')
echo "*** received prompt after: $buf$c ***"
echo '*** send C as option ***'
buf=""
;;
*)
buf="$buf$c"
;;
esac
done < example

echo "*** final buffer is: $buf ***"

结果是:

*** received prompt after: 
Choose action:[A]: Action A [B]: Action B
[C]: cancel
? ***
*** send C as option ***
*** final buffer is: [C]
***

关于bash - bash 中的 IPC(使用命名管道,不使用 expect),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31581657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com