我想要实现的是将shell脚本连接到fifo上,并对读取的某些命令做出React(使用通常的read命令)。这看起来很简单,但令我惊讶的是,read命令并没有像我预期的那样做出React。请参见以下简单脚本:
#!/bin/bash
while true; do
read ONE_SENTENCE
echo Simon says : ${ONE_SENTENCE}
sleep 1
done
我通过“./test.sh〈in.pipe”启动此程序,其中in.pipe是“mkfifoin.pipe”
现在,如果我用“echo test1〉in.pipe”在管道中写入sting,我会得到下面的结果:
stc@host:~$ ./test.sh < in.pipe
Simon says : test1
Simon says :
Simon says :
Simon says :
Simon says :
Simon says :
Simon says :
Simon says :
换句话说,读取不会阻塞,它总是找到要读取的内容。我错过了什么?显然,我希望读取阻塞,直到有新数据
2条答案
按热度按时间qlvxas9a1#
关键是只有在成功读取时才输出
ONE_SENTENCE
,例如除非从fifo中有效读取一行,否则管道不会产生任何输出。
一个小的变化,方便地为你设置fifo,并在脚本退出时删除它。(下面避免使用大写的变量)
脚本执行完全相同的操作(除了1/2秒
sleep
,但它创建fifo并设置trap
以在进入读取循环之前删除它。nbnkbykc2#
谢谢你的回答,同时我也得到了我想要的
上面的代码阻塞(如预期)...但我仍然不明白为什么第一个脚本没有阻塞...无论如何,无论如何,它都能工作