要命令本身支持,如ls就不是管道命令。下面以c++为例说一下怎么编写管道命令.
管道其实就是把上一个命令的标准输出改变为下一个命令的标准输入。那么命令只要支持从标准输入读取数据并处理,那么这个命令就支持管道,是个管道命令。c++使用 std::cin 来读取来自标准输入的数据,见如下代码片段,逐行获取标准输入的数据,然后写入leveldb中:
/*从管道读取数据写入leveldb*/
int pipe_to_db( const string sep, const string db_path) {
nosql db(db_path);
string row;
int e;
vector<string> v_f;
while(!cin.eof()) {
getline(cin, row);
e=row.find_last_not_of("\n");
row = row.substr(0, e+1);
v_f = explode(sep, row);
if (v_f.size() < 2) {
continue;
}
db.put(v_f[0], v_f[1]);
}
return 0;
}
这里有个问题需要注意一下,那就是结束条件,这里使用的遇到文件结束符就不再读取数据。实际测试用管道符接在awk命令后,不会进入死循环,数据正常。若是键盘测试,需要手动输入文件结束符(linux 下:ctrl+d, windows下:ctrl+z)来结束循环