我有一个程序,可以输出一些文本,然后是连续的字符流:
perl -E '$|=1;print "OUTn";print "A" and sleep 1 for 1..10'
我想尽快退出此程序。在输出中看到,我尝试了:
grep -m 1 A <(perl -E '$|=1;print "OUTn";print "A" and sleep 1 for 1..10')
但是,在Perl程序退出之前,Grep似乎没有看到" A"。
。我也尝试过没有运气的SED;
sed /A/q <(perl -E '$|=1;print "OUTn";print "A" and sleep 1 for 1..10')
有什么想法我如何解决?
此处的问题是grep
和sed
都对其输入进行列表,除非另有说明。一个解决方法是插入新线,例如使用COREUTILS fold
:
grep -m 1 A
<(perl -E '$|=1;print "OUTn";print "A" and sleep 1 for 1..10' | fold -w1)
,这仍然是由于缓冲而存在问题。您可以使用CORUTILS stdbuf
禁用此内容:
grep -m 1 A
<(perl -E '$|=1;print "OUTn";print "A" and sleep 1 for 1..10' |
stdbuf -o0 fold -w1)
另一种选择是使用dd
,例如:
perl -E '$|=1;print "OUTn";print "A" and sleep 1 for 1..10' |
while :; do
c=$(dd bs=1 count=1 status=none)
if [[ "$c" == "A" ]]; then
break
else
: Do something else
fi
done