小编Ola*_*eld的帖子

bash read -r -N跳过部分输入

这行写"foo",睡觉,然后写"bla":

echo "woo"; sleep 2; echo "bla"
Run Code Online (Sandbox Code Playgroud)

我试图在两个连续的读命令中读取它的整个输出:

(echo "woo"; sleep 2; echo "bla") 1> \
>(IFS=""; read -t 0.1 -r -N 10; \
echo "exit code: $? reply: $REPLY"; \
sleep 5; \
read -t 0.1 -r -N 10; \
echo "exit code: $? reply: $REPLY")
Run Code Online (Sandbox Code Playgroud)

第一次阅读打印:

退出代码:142回复:

这是有点期望的,因为142是超时,我用-t 0.1调用read.但第二次阅读打印:

退出代码:1回复:bla

问题:"呜"哪里去了?!

如果我sleep 2从输出行中删除,整个过程按预期工作 - 在第一次读取时读取/输出整个"woo \nbla"序列,并返回1(EOF).

无论多短,任何睡眠都会重现问题.如果我使用管道重定向输出而不是> 1也没关系.这是Ubuntu.

编辑:我想读入N个字符的缓冲区,并按原样读取输入,在分隔符上没有任何分词.因此,-N和IFS ="".

编辑:这是一个展示一般问题的玩具示例.我想要做的是在bash中实现更智能的tee版本:它应该像tee一样,除了它应该等待其输入生成过程停止,然后刷新其缓冲区,然后退出.如果输入生成过程启动一些僵尸子进程,那么真正的tee会无限期挂起,因为它们会占用stdout句柄并且永远不会被关闭.使用tail --pid工作,但不幸的是它在Windows上不起作用,我需要这个是多平台的.我认为这可以通过在循环中调用read -t -N来实现,但显然这不起作用......

bash ubuntu

6
推荐指数
1
解决办法
175
查看次数

标签 统计

bash ×1

ubuntu ×1