【发布时间】:2021-09-19 11:58:21
【问题描述】:
cat > filename << EOF 与 cat << EOF > filename
当我测试它时,它们看起来是等价的,但我不完全理解为什么会这样。
我了解此命令的目的是不断地将 STDOUT 转换为文件名,直到我键入 EOF 然后 CTRL-D。
cat > filename << EOF(就其顺序而言)对我来说很有意义:将内容输出到文件名中,直到我点击 EOF 告诉它停止。
但我很惊讶cat << EOF > filename 也有效。有人告诉我 bash 从左到右读取。在这种情况下,我的 STDOUT 是如何获取文件名的?
【问题讨论】:
-
重定向是从左到右处理的,但是所有重定向必须在
cat开始之前完成(直到重定向完成,进程的文件句柄还没有准备好,所以它还不能被调用)。 -
cat >filename <<EOF并不真正意味着“在您键入 EOF 之前将内容发送到文件名”。它的真正含义是“将文件名连接到标准输出,然后将标准输入连接到一个临时文件,该文件包含我要在其中输入的所有内容,直到 EOF,然后运行程序cat”。请注意,cat直到您输入EOF! 之后 才会开始