Edward Torvalds Asked: 2015-11-13 03:24:39 +0800 CST2015-11-13 03:24:39 +0800 CST 2015-11-13 03:24:39 +0800 CST 我什么时候应该使用 < 或 <() 或 << 和 > 或 >()? 772 我知道 , <,<()都<<用于提供输入 >,>()而 , 用于重定向输出。 但我不知道它们之间有什么明显区别以及何时使用它们。如果可能,请详细解释并附上参考资料。谢谢 command-line 2 个回答 Voted Best Answer Oli 2015-11-13T03:30:36+08:002015-11-13T03:30:36+08:00 “何时使用”真的取决于你在做什么。这就像询问何时使用十字螺丝刀或一字螺丝刀。我可以告诉你它们都是什么,它们有什么作用,但是确定何时使用它们取决于你自己。 所有这些都在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"是一个继承字符串。它被读入 STDIN。这可以做变量替换。 | command将当前的 STDOUT 加入到的 STDINcommand |& command将 STDOUT 和 STDERR 加入到的 STDIN 上command(对于 grepping 错误输出很有用) 1>并2>用于显式重定向 STDOUT 和 STDERR。>暗示1>所以你很少看到它被明确使用。 以类似的方式>&1,>&2可用于重定向到STDOUT 和 STDIN。 /dev/std{in,out,err}也作为基本输入/输出/错误文件描述符的符号链接存在。例如,当某些东西只接受文件名参数但您希望它写入 STDOUT 时,这非常方便。 Sergiy Kolodyazhnyy 2015-11-13T08:49:56+08:002015-11-13T08:49:56+08:00 奥利的回答已经提供了大量的解释。我在这个答案中的目的是提供几个实际示例。 输入重定向 [command] < file <重定向用于将输出从文件发送到命令。如果你能想象,虚拟线从键盘上拔下并插入到文件中。当你不想使用管道,或者不能使用管道时,它工作得很好。 例如,假设我有一个文件列表。我想对每个文件名运行某种测试(可能检查文件是否存在,或者是特定文件)。 while read FILENAME; do [ -d $FILENAME ] && echo $FILENAME;done < fileList.txt 通常这样的命令read从 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
“何时使用”真的取决于你在做什么。这就像询问何时使用十字螺丝刀或一字螺丝刀。我可以告诉你它们都是什么,它们有什么作用,但是确定何时使用它们取决于你自己。
所有这些都在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"
是一个继承字符串。它被读入 STDIN。这可以做变量替换。| command
将当前的 STDOUT 加入到的 STDINcommand
|& command
将 STDOUT 和 STDERR 加入到的 STDIN 上command
(对于 grepping 错误输出很有用)1>
并2>
用于显式重定向 STDOUT 和 STDERR。>
暗示1>
所以你很少看到它被明确使用。>&1
,>&2
可用于重定向到STDOUT 和 STDIN。/dev/std{in,out,err}
也作为基本输入/输出/错误文件描述符的符号链接存在。例如,当某些东西只接受文件名参数但您希望它写入 STDOUT 时,这非常方便。奥利的回答已经提供了大量的解释。我在这个答案中的目的是提供几个实际示例。
输入重定向 [command] < file
<
重定向用于将输出从文件发送到命令。如果你能想象,虚拟线从键盘上拔下并插入到文件中。当你不想使用管道,或者不能使用管道时,它工作得很好。例如,假设我有一个文件列表。我想对每个文件名运行某种测试(可能检查文件是否存在,或者是特定文件)。
通常这样的命令
read
从 STDIN 获取输入,但是使用<
运算符我们让它从文件中获取输入。这里文档<<
当您想对另一个命令或多个命令的输出进行操作,但不想创建文件时,这非常有用。
在我对bash 中 <<、<<< 和 < < 有什么区别?, 我展示了两个简单的例子
wc < <(echo bar;echo foo)
和diff <(ls /bin) <(ls /usr/bin)
。最后一个特别有用 - 我们正在比较两个命令的输出,而无需创建用于存储要比较的数据的文件。使用 COMMAND1 > >(COMMAND2) 重定向
这个相当于管道。
如Greg 的 wiki所示,这可用于为多个命令提供相同的输入