SUSv4 2016版中sh的STDIN的描述说
它不应以这样一种方式进行预读,即被调用的命令打算读取的任何字符都被 shell 消耗
我做了一个实验,通过将以下脚本文件重定向到sh -s
:
#!/bin/sh
./rewind # a c program that reads up its stdin, prints it to stdout, before SEEK_SET its standard input to 0.
echo 1234-1234
它不断打印出“echo 1234-1234”。(如果 shell 消耗了整个文件块,它只会打印出“1234-1234”)
很明显,shell(至少是我的)确实在行边界处读取。
但是,当我检查 FreeBSD ash "input.c" 源代码时,它读取的是 BUFSIZ 字节块,我不明白它是如何保留行边界的。
我想知道的是:当它们的源代码明显显示它们以块的形式读取时,shell 如何保留行边界?