【问题标题】:Why does bash use/need so many input redirect symbols?为什么 bash 使用/需要这么多输入重定向符号?
【发布时间】:2017-11-15 18:51:19
【问题描述】:

我很好奇使用多个​​“

效率和性能总是需要权衡取舍,读/写能力的易用性或可用性的易用性也是如此。我是一只试图学习新技巧的老狗。我理解的 10 行代码,与我不理解的一行代码执行相同的任务,对我来说是值得的。在我多年的脚本编写工作中,我很少遇到需要写入非易失性存储的情况,除非它打算“永久”留在那里。

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

【问题讨论】:

  • 你有更具体的例子吗? > 表示“写入”,>> 表示“附加到”,它们有不同的含义。
  • 你试过阅读the docs吗?
  • @OliverCharlesworth 二十多年来,我一直在努力阅读这些文档。
  • 虽然我基本同意<<< 不是需要,但它非常方便。同样的,虽然可以做cat 'contents' > file; cmd < file; rm file之类的事情,但是做cmd << EOF\ncontents\nEOF这样更方便
  • 我需要一个更好的例子,威廉。想到 UUOC(对不起):)。但实际上,'(command

标签: bash redirect


【解决方案1】:

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

  • <输入重定向
  • <<这里文档
  • <<< Here String(here 文档的变体)

示例

<输入重定向

grep foo < a-file.txt

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

&lt;&lt;这里文档

grep foo <<EOF
foo
foobar
baz
bar
EOF

注意EOF 就在&lt;&lt; 之后和最后一行。来自man bash

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

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

&lt;&lt;&lt;这里字符串(这里文档的变体)

grep foo <<<"foobar"

您可以在此处将其视为“单行”文档 (&lt;&lt;)。 grep 获取字符串“foobar”作为输入。

对于正确编写的命令、函数或子例程来说,单个“

所以,使用哪种变体是正确的取决于您的用例并且独立于您正在使用的命令,因为您的外壳(很可能bash)会处理他们。

我推荐bash 手册的3.6 重定向 部分供进一步阅读。关于&lt;&lt;&lt;&lt;&lt;&lt;的部分分别是3.6.13.6.63.6.7https://www.gnu.org/software/bash/manual/bash.html#Redirections

【讨论】:

  • 这是我能想到的最好的外行术语答案。谢谢!我很欣赏具体的手册参考。
猜你喜欢
  • 2011-08-05
  • 2011-05-27
  • 1970-01-01
  • 2010-12-15
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
相关资源
最近更新 更多