“cat > filename << EOF”和“cat << EOF > filename”是不是等效? [复制]

Posted

技术标签:

【中文标题】“cat > filename << EOF”和“cat << EOF > filename”是不是等效? [复制]【英文标题】: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! 之后 才会开始 【参考方案1】:

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

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

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

【讨论】:

以上是关于“cat > filename << EOF”和“cat << EOF > filename”是不是等效? [复制]的主要内容,如果未能解决你的问题,请参考以下文章