这是带有注释的shell命令序列
#cd `mktemp -d`
mkfifo i
exec 3<>i # keep pipe open
bash <i & # run bash interpreter in background, use -x option to see what and when is executed
echo 'echo X' >i # writes X immediately
echo 'if echo -n A; then' >i # waits for input till end of if-statement
echo 'echo B; fi' >i # writes AB
echo 'echo C; sleep 7; echo D' >i # does not wait on stdin while sleep
echo 'exit' >i # also kill $(jobs -p)
except
会有所帮助吗?
答案 0 :(得分:1)
其行为与交互式终端中的行为相同。只需尝试:
you@yourpc ~ sleep 3<enter>
ls<enter>
wait...
you@yourpc ~ ls<inserted by bash>
file1 file2 file3 ...
在man 7 pipe
管道和FIFO上的I / O
...
如果进程尝试从空管道读取,则read(2)将阻塞,直到有可用数据为止。如果过程尝试 写入一个完整的管道(请参见下文),然后执行write(2)块,直到从管道中读取了足够的数据以允许写入完成。
...
管道容量
管道的容量有限。如果管道已满,则write(2)将阻塞或失败,具体取决于O_NON- 设置了BLOCK标志(见下文)。不同的实现对管道容量有不同的限制。申请应 不依赖于特定容量:应设计一个应用程序,以便读取过程尽快消耗数据 可用,因此不会阻止写入过程。
这意味着fifo的写入端没有有关读取器何时读取或处理输入的信息。