【问题标题】:Are "cat > filename << EOF" and "cat << EOF > filename" equivalent? [duplicate]“cat > filename << EOF”和“cat << EOF > filename”是否等效? [复制]
【发布时间】:2021-09-19 11:58:21
【问题描述】:

cat &gt; filename &lt;&lt; EOFcat &lt;&lt; EOF &gt; filename

当我测试它时,它们看起来是等价的,但我不完全理解为什么会这样。

我了解此命令的目的是不断地将 STDOUT 转换为文件名,直到我键入 EOF 然后 CTRL-D。

cat &gt; filename &lt;&lt; EOF(就其顺序而言)对我来说很有意义:将内容输出到文件名中,直到我点击 EOF 告诉它停止。

但我很惊讶cat &lt;&lt; EOF &gt; filename 也有效。有人告诉我 bash 从左到右读取。在这种情况下,我的 STDOUT 是如何获取文件名的?

【问题讨论】:

  • 重定向是从左到右处理的,但是所有重定向必须在cat开始之前完成(直到重定向完成,进程的文件句柄还没有准备好,所以它还不能被调用)。
  • cat &gt;filename &lt;&lt;EOF 并不真正意味着“在您键入 EOF 之前将内容发送到文件名”。它的真正含义是“将文件名连接到标准输出,然后将标准输入连接到一个临时文件,该文件包含我要在其中输入的所有内容,直到 EOF,然后运行程序cat”。请注意,cat 直到您输入 EOF! 之后 才会开始

标签: bash heredoc


【解决方案1】:

&lt;&lt; EOF 控制进入cat 的标准输入的内容。

&gt; filename 控制cat 的标准输出的位置。

两者应用哪个顺序无关紧要,结果是一样的。当然,cat 负责将其输入复制到其输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-22
    • 2016-09-11
    • 2019-09-06
    • 2012-08-07
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多