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

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

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

“何时使用”实际上取决于你在做什么。 这就像问什么时候使用菲利普斯或一个槽头螺丝刀。 我可以告诉你他们是什么,他们做了什么,但是当你使用每一个时,锻炼取决于你。

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

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

奥利的回答已经提供了很多解释。 我在这个答案中的目的是提供几个实际的例子。


使用[command]

<重定向用于将文件的输出发送到命令。 如果可以想象,虚拟线从键盘上拔下并插入文件。 当您不想使用管道或不能使用管道时,它可以很好地工作。

例如,假设我有一个文件列表。 我想对每个文件名运行某种测试(也许检查文件是否存在,或者是特定文件)。

  while read FILENAME; do [ -d $FILENAME ] && echo $FILENAME;done < fileList.txt 

通常这样的命令如从STDIN获取输入,但是使用<运算符我们从文件中获取输入。

这里的文件<<

当您想要操作另一个命令或多个命令的输出但不想创建文件时,这非常有用。

在我的回答中, <<,<<<和<<在bash中有什么区别? ,我已经展示了两个简单的例子: wc < <(echo bar;echo foo)diff <(ls /bin) <(ls /usr/bin) 。 最后一个特别有用 - 我们比较了两个命令的输出,而没有创建用于存储要比较的数据的文件。

使用COMMAND1重定向>>(COMMAND2)

这相当于管道。

 xieerqi@eagle:~$ df > >(grep "dev" ) xieerqi@eagle:~$ /dev/sda1 115247656 83004376 26365932 76% / udev 2914492 4 2914488 1% /dev 

如Greg的wiki所示,这可以用于为多个命令提供相同的输入

 some_command | tee >(grep A > A.out) >(grep B > B.out) >(grep C > C.out) > /dev/null