【问题标题】:Shell redirection vs explicit file handling codeShell 重定向与显式文件处理代码
【发布时间】:2011-09-05 06:20:49
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 如果存在这样的约定,grep 之类的工具就不会遵循它。
  • 如果人们期望从这样的工具中获得这些(无论它多么不合逻辑),那么遵循它们是有意义的。并且不要忘记 *nix 工具用于多对多环境。也许有些时候在 stdio 中使用参数更方便。
  • 是的,grep 确实使用 -f,但您可以执行 grep 模式 FILENAMES,因此接受文件名参数,而不是仅从 STDIN 读取行。此外,grep 有 -r -D -d 参数——处理directory in the argument list 问题等等。每次都很好地有论据来处理例如@ikegami 告诉的情况。

标签: c shell redirect


【解决方案1】:

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

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

如果您不想做任何这些,那么作为一个简单的过滤器就没有错。如果他们愿意,任何人都可以提供一组简单的 shell 包装器来提供cmd infile outfile 语法。

【讨论】:

    【解决方案2】:

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

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

    这并不妨碍find 被使用

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

    【讨论】:

      【解决方案3】:

      其实要达到和shell重定向一样的效果你可以这样做:

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

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

      【讨论】:

        【解决方案4】:

        很高兴有作为选项运行任何带有文件名参数的命令。如您的示例:

        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 会更容易(更快)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-20
          • 1970-01-01
          相关资源
          最近更新 更多