为什么bash使用/需要这么多输入重定向符号?

时间:2017-11-15 18:51:20

标签: bash redirect

我很好奇使用多个​​"<"满足某些bash重定向的字符。什么时候&lt ;,<<<<<<<<<<<<<<在什么条件下?不应该只是一个"<"是否足以正确编写命令,功能或子程序?在unix'一切'是一个文件。那么为什么要用流程替换来掩盖它呢?那不仅仅是任何shell的自然(分组)功能的掩码吗?或者在某些情况下只是正确的执行顺序问题?

效率和性能总是需要权衡,易读/写能力或易用性也是如此。我是一只试图学习新技巧的老狗。我理解的10行代码,与我不理解的一行代码执行相同的任务,值得我权衡。在我多年的脚本编写中,我几乎没有需要写入非易失性存储的情况,除非它打算永久地留在那里""永久。

我没有看到输出的这种参考。单个">"将创建/覆盖文件。双">>"将创建/附加文件。是否有">>>"输出呢?这是一个多余的问题。我只对输入重定向感兴趣。

1 个答案:

答案 0 :(得分:2)

简单来说,它们都有不同的含义。

  • <重定向输入
  • <<此处文件
  • <<<此处字符串(此处文档的变体)

实施例

<重定向输入

grep foo < a-file.txt

这会将a-file.txt内容重定向到grep的标准输入。 grep会搜索字符串&#39; foo&#39;的出现次数。在文件a-file.txt中。

<<此处文件

grep foo <<EOF
foo
foobar
baz
bar
EOF

EOF之后和最后一行注意<<。来自man bash

  

这种类型的重定向指示shell从当前源读取输入,直到看到只包含分隔符(没有尾随空格)的行。

如此有效,grep将两个EOF包围的字符串作为输入。

<<< Here String(此处文档的变体)

grep foo <<<"foobar"

您可以将此视为&#34;单行&#34;这里是文件(<<)。 grep获取字符串&#34; foobar&#34;作为输入。

  

不应该是一个&#34;&lt;&#34;是否足以正确编写命令,功能或子程序?

那么,在您的用例中使用依赖的哪个变体是正确的,并且与您使用的命令无关,作为您的shell(很可能是bash)会照顾他们。

我建议使用bash手册的 3.6重定向部分进一步阅读。有关<<<<<<的部分为3.6.13.6.63.6.7https://www.gnu.org/software/bash/manual/bash.html#Redirections