我正在编写一个bash脚本,与现有的perl程序进行交互。不幸的是,我不能修改现有的perl程序,也不能使用expect。
目前,脚本的工作方式类似于这个stackoverflow答案Is it possible to make a bash shell script interact with another command line program?。
问题是(读作:似乎是),perl程序在请求输入之前并不总是发送
所以基本上perl程序正在等待输入,但用户不知道,因为屏幕上没有任何内容。
所以我在bash脚本中做的是:
那很好,除非perl程序正在执行类似以下操作的内容
然后bash脚本只能“看到”
但不包括
这并不是最棘手的情况,但它是最容易描述的一个。
有没有办法确保
或者有更好的方法吗(鉴于限制条件,我不能修改perl程序,也不能使用
目前,脚本的工作方式类似于这个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
)?
[C]
后面加上一个换行符,即打印"[C] \n";
。 - 123<$writepipe [call perl program] | sed -u 's/ ? \[C\] /&\n/g' &> $readpipe &
)。 - bufh[call perl program]
,从而在其周围提供伪终端。/usr/bin/env python -c "import pty, sys; pty.spawn(sys.argv[1:])" /path/to/program.pl < $writepipe &> $readpipe
- bishop$|++
。我知道这很老旧,但如果这是解决你所看到的问题的方法,那将会很有趣。 - Jim