您正在将两个子流程合二为一。相反echo
,command
应该分开处理,并在它们之间设置一个管道。出于某种原因,Stack Overflow 和其他站点上的许多示例都使用了这些Process.spawn_*
函数,但使用 GSubprocess 是一种更简单的语法。
此示例通过管道传输 to 的输出find .
,sort
然后将输出打印到控制台。该示例有点长,因为它是一个完整的示例,并且使用 GMainContext 进行异步调用。GMainContext 被 GMainLoop、GApplication 和 GtkApplication 使用:
void main () {
var mainloop = new MainLoop ();
SourceFunc quit = ()=> {
mainloop.quit ();
return Source.REMOVE;
};
read_piped_commands.begin ("find .", "sort", quit);
mainloop.run ();
}
async void read_piped_commands (string first_command, string second_command, SourceFunc quit) {
var output = splice_subprocesses (first_command, second_command);
try {
string? line = null;
do {
line = yield output.read_line_async ();
print (@"$(line ?? "")\n");
}
while (line != null);
} catch (Error error) {
print (@"Error: $(error.message)\n");
}
quit ();
}
DataInputStream splice_subprocesses (string first_command, string second_command) {
InputStream end_pipe = null;
try {
var first = new Subprocess.newv (first_command.split (" "), STDOUT_PIPE);
var second = new Subprocess.newv (second_command.split (" "), STDIN_PIPE | STDOUT_PIPE);
second.get_stdin_pipe ().splice (first.get_stdout_pipe (), CLOSE_TARGET);
end_pipe = second.get_stdout_pipe ();
} catch (Error error) {
print (@"Error: $(error.message)\n");
}
return new DataInputStream (end_pipe);
}
它是splice_subprocesses
回答您问题的功能。它将第一个命令中的 STDOUT 作为 an并将其与第二个命令的 (STDIN)InputStream
拼接起来。OutputStream
该read_piped_commands
函数从管道末端获取输出。这是一个InputStream
已被包装在 aDataInputStream
中以提供访问read_line_async
便利方法的方法。