编译一个更简单的测试程序就可以看出问题
int main() { execlp("/bin/sed", "-e", "s/^/XXX:/", NULL); }
所有这一切都是启动一个 sed 版本(而不是 shell)并通过在前面添加“XXX:”来转换输入。
如果运行生成的程序,并在终端中键入,您会得到如下行为:
$./a.out
Hello
XXX:Hello
Test
XXX:Test
^D
这正是我们所期望的。
现在,如果您从包含“Hello\nWorld”的文件中为其提供输入,您会得到
$./a.out < file
XXX:Hello
XXX:World
$
应用程序立即退出,当输入文件全部读取后,应用程序的输入流将被关闭。
如果你想提供额外的输入,你需要使用一个技巧来不破坏输入流。
{ cat file ; cat - ; } | ./a.out
这会将文件中的所有输入放入正在运行的./a.out
进而
从标准输入读取并添加它。
$ { cat file ; cat - ; } | ./a.out
XXX:Hello
XXX:World
This is a Test
XXX:This is a Test