在Linux,很多命令都接受标准输入作为命令的参数。比如grep,echo命令都是可以接受标准输入作为命令的参数。
grep命令的全称是全局正则表达式打印,它是Linux中功能最强大且最常用的命令之一。
grep在一个或多个输入文件中搜索与指定模式匹配的行,并将匹配行写入标准输出。如果未指定文件,grep则从标准输入读取内容。
在本教程中,我们将在dart创建进程运行grep命令并将通过管道传递字符串作为grep命令的参数,参数将作为grep命令的标准输入传递。
在dart,进程的标准输入仅接受一个参数并且类型是Stream
,因此不能直接传递字符串给进程的标准输入。
必须在传递给进程的标准输入之前将字符串转换为二进制流。转换字符串为二进制流,这涉及两个步骤的操作。
第一步是将字符串转换为二进制的的值,在这一步骤中,dart内置Utf8Codec
对象encode
方法可以帮助我们转换字符串为二进制。
第二步使用二进制的值创建流Stream
。Stream对象value
函数从指定的值创建流Stream。
value
函数可以接受任意类型的值。如果传递给value
函数的值是二进制类型,将会返回一个二进制流Stream<int>
。
最后,我们就可以使用Stream
管道pipe
函数传递到进程的标准输入。
在下面的示例中,我们将启动grep命令的进程,grep进程将在标准输入中读取参数搜索hello字符串。
import 'dart:io';
import 'dart:convert';
main() async {
var grep = await Process.start('grep', ['hello']);
Stream.value(const Utf8Codec().encode(server)).pipe(grep.stdin);
}