“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 > 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
! 之后 才会开始
【参考方案1】:
<< EOF
控制进入cat
的标准输入的内容。
> filename
控制cat
的标准输出的位置。
两者应用哪个顺序无关紧要,结果是一样的。当然,cat
负责将其输入复制到其输出。
【讨论】:
以上是关于“cat > filename << EOF”和“cat << EOF > filename”是不是等效? [复制]的主要内容,如果未能解决你的问题,请参考以下文章