我什么时候应该使用<或<()或<或>()?
我知道<
, <()
, <<
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