Shell重定向与显式文件处理代码

时间:2011-05-31 07:15:29

标签: c shell redirect

我不是母语为英语的人,所以请原谅这个问题的尴尬标题。我只是不知道如何更好地表达它。

我在FreeBSD框中,我有一个用C编写的小过滤工具,它通过stdin读取数据列表,并通过stdout输出已处理的列表。我有点像这样调用它:find . -type f | myfilter > /tmp/processed.txt

现在我想给我的滤镜多一点曝光并发布它。公约说工具应该允许这样的事情:find . -type f | myfilter -f - -o /tmp/processed.text

这会迫使我编写根本不需要的代码,因为shell可以完成这项工作,因此我倾向于将其删除。

我的问题是:我是否会错过一些参数(除了惯例之外)为什么文件的读写应该在我的代码中完成而不是委托给shell重定向?

4 个答案:

答案 0 :(得分:2)

这绝对没有错。您的过滤器的界面类似于c++filt

如果您想根据输入文件的名称自动选择输出文件,或者您希望在单个命令中处理多个文件的特殊处理,则可以考虑文件处理。

如果你不想做其中任何一个,那么做一个简单的过滤器就没有错。任何人都可以提供一组简单的shell包装器,以便在需要时提供cmd infile outfile语法。

答案 1 :(得分:1)

这是一个不必要的限制界面。从命令行接受参数更灵活,

grep foo file | myfilter > /tmp/processed.text

并且不排除使用find

find . -type f -exec myfilter {} + > /tmp/processed.text

答案 2 :(得分:1)

实际上,为了与shell重定向具有相同的效果,您可以这样做:

freopen( "filename" , "wb" , stdout );

所以如果你在整个代码中使用了printf,输出将被重定向到文件。因此,您无需修改​​之前编写的任何代码,并且可以轻松地适应约定。

答案 3 :(得分:0)

使用filename参数运行任何命令都很好。如你的例子所示:

myfilter [-f ./infile] [-o ./outfile] #or
myfilter [-o outfile] [filename] #and (the best one)
myfilter [-f file] [-o file] #so, when the input and output are the same file - the filter should working correctly anyway

对于好的示例,请检查sort命令。通常在管道中用作文件管理器,但可以[-o output]并正确处理same input/output problem ...

为什么它好?例如,当想要通过“fork / exec”从“C”运行命令并且不想启动shell来处理I / O.在这种情况下,使用参数更容易(和更快)execve(.....)使用shell包装器启动cmd。