我什么时候应该使用 < 或 <() 或 << 和 > 或 >()?

Edw*_*lds 4 command-line bash redirect

我知道<, <(), <<all 用于提供输入, >,>()用于重定向输出。

但我不知道它们之间有什么明显的区别以及何时使用它们。如果可能,请详细解释并附上参考资料。谢谢

Oli*_*Oli 12

“何时使用”实际上取决于您在做什么。这就像询问何时使用十字螺丝刀或一字螺丝刀一样。我可以告诉你它们都是什么,它们的作用是什么,但你何时使用每一个,取决于你。

所有这些都在TLDP Advanced Bash Scripting Guide 中有详细记录。如果你需要例子,那就是这个地方。

  • < filename 从文件读取到 STDIN
  • > filename 将 STDOUT 写入文件,覆盖任何内容。
  • >> filename 将 STDOUT 写入文件,如果它已经存在则追加。
  • <(command) 吸收内部命令的输出并提供文件名
  • >(command)为外部命令提供文件名,但实际上将写入它的任何内容重定向到内部command.
  • <<TOKEN是一个 here 文档,又名 heredoc。它会读入 STDIN 之后的任何内容,直到TOKEN再次看到为止。它对多行内容很有用。它必须跟一个换行符。除非您引用标记,否则heredocs 支持变量替换。
  • <<-TOKEN与上面一样,只是它会忽略前导选项卡(但仅限选项卡)。这对于保留源格式很方便,但它确实只适用于选项卡。它在 Stack Exchange 站点上变得无用,因为它们用制表符代替空格:(
  • <<"TOKEN"是一个不能替代的heredoc $variables
  • <<<"string"是一个herestring。它被读入 STDIN。这可以进行变量替换。
  • | command 将当前的 STDOUT 加入到 command
  • |& command将 STDOUT 和 STDERR 连接到的 STDIN command(用于 grepping 错误输出)
  • 1>并且2>用于显式重定向 STDOUT 和 STDERR。>暗示1>所以你很少看到它明确使用。
  • 以类似的方式>&1>&2可用于重定向STDOUT 和 STDIN。
  • /dev/std{in,out,err}也作为基本输入/输出/错误文件描述符的符号链接存在。例如,当某些内容只接受文件名参数但您希望它写入 STDOUT 时,这非常方便。

  • @edwardtorvalds `&lt;&lt;&lt;` 被称为 Here Strings,它是 Here Doc..You 不需要显式的 `TOKEN` in `&lt;&lt;&lt;` ..`&lt;&lt;&lt;` 基本上用于单行.. (3认同)