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

C Shell重定向与显式文件处理代码,c,shell,redirect,C,Shell,Redirect,我不是一个以英语为母语的人,所以请原谅这个问题的尴尬标题。我只是不知道如何更好地表达它 我在一个免费的BSD盒上,我有一个用C编写的小过滤工具,它通过stdin读取数据列表,并通过stdout输出处理过的列表。我这样调用它:find-键入f | myfilter>/tmp/processed.txt 现在我想给我的过滤器多一点曝光,然后发布它。按照惯例,工具应该允许这样的操作:find-键入f | myfilter-f--o/tmp/processed.text 这将迫使我编写一些根本不需要的代

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

我在一个免费的BSD盒上,我有一个用
C
编写的小过滤工具,它通过
stdin
读取数据列表,并通过
stdout
输出处理过的列表。我这样调用它:
find-键入f | myfilter>/tmp/processed.txt

现在我想给我的过滤器多一点曝光,然后发布它。按照惯例,工具应该允许这样的操作:
find-键入f | myfilter-f--o/tmp/processed.text

这将迫使我编写一些根本不需要的代码,因为shell可以完成这项工作,因此我倾向于忽略它


我的问题是:我是否遗漏了一些论点(除了约定之外),为什么文件的读写应该在我的代码中完成,而不是委托给shell重定向?

这绝对没有错。您的过滤器将有一个类似于c++filt的接口,比如说,
c++filt

<>你可能会考虑文件处理,如果你想根据输入文件的名称自动选择一个输出文件,或者你想在一个命令中处理多个文件的特殊处理。
如果你不想做这两件事,那么做一个简单的过滤器没有什么错。如果愿意,任何人都可以提供一组简单的shell包装器来提供
cmd-infile-outfile
语法。

可以选择使用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输出]
并正确处理
相同的输入/输出问题


为什么它是好的?例如,如果希望通过“fork/exec”从“C”运行命令,而不希望启动shell来处理I/O。在这种情况下,
execve(…)
的参数与使用shell包装器启动cmd的参数相同。

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

grep foo file | myfilter > /tmp/processed.text
而且它并不排除使用
find

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

实际上,要达到与shell重定向相同的效果,可以执行以下操作:

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

因此,如果您在整个代码中使用了printf,那么输出将重定向到该文件。因此,您不需要修改以前编写的任何代码,也可以轻松地适应约定。

如果存在这样的约定,像
grep
这样的工具就不会遵循它。如果人们希望从这样的工具获得这些代码(无论它多么不合逻辑),那么遵循它们是有意义的。别忘了*nix工具在许多环境中都有使用。也许有时候在stdio之外使用参数更方便。是的,grep确实使用了-f,但是您可以使用grep模式文件名,所以接受filename参数,而不是只从STDIN读取行。此外,grep还有-r-D-D参数-处理参数列表中的
目录
问题等等。每次都有参数来处理情况是很好的,比如@ikegami告诉我们的。