当读取bash中的管道时,"读取"没有超时

i0e*_*ion 11 bash timeout

我使用创建管道

mkfifo /tmp/foo.pipe
Run Code Online (Sandbox Code Playgroud)

现在,我想尝试从管道读取最多2秒,所以我执行

read -t 2 line < /tmp/foo.pipe
Run Code Online (Sandbox Code Playgroud)

超时不会发生.读只是坐在那里等待管道的输入.

手册说'read'应该与命名管道一起使用.有谁知道为什么会这样?

ls -al /tmp/foo.pipe
prw-r----- 1 foo bar 0 Jun 22 19:06 /tmp/foo.pipe
Run Code Online (Sandbox Code Playgroud)

MZS*_*MZS 18

在调用read builtin之前,你的shell在open()调用时被阻塞了.

在Linux上,您可以同时打开FIFO进行读写操作,以防止打开时阻塞; 这是不可移植的,但可以做你想要的.

read -t 2 <>/tmp/foo.pipe
Run Code Online (Sandbox Code Playgroud)

改编自:带有非阻塞读取的Bash脚本