如何理解“cat > file_name < blah”命令?

如何理解“cat > file_name < blah”命令?

在以下命令中,cat 获取here-doc 的内容并将其重定向到名为conf 的文件:

cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF

这里的命令顺序怎么理解呢?是否bash首先处理其他所有内容(此处为文档部分),然后作为最后一步,它看起来是> conf部分?

答案1

此处文档是一种 shell 重定向,因此 shell 会像正常重定向一样执行它,从开始到结束(或从左到右,或出现的顺序)。这是 POSIX 定义的:

如果一个命令指定了多个重定向运算符,则计算顺序为从开始到结束。


在您的命令中,cat> conf首先执行打开并截断conf文件以进行写入,然后从Here-Document.

使用strace,您可以验证它:

$ strace -f -e trace=open,dup2 sh -c 'cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF
'
...
open("conf", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
dup2(3, 0)                              = 0
...

答案2

好吧,让我们来了解一下:

unset file
cat >"$file" <<EOF
this is not in ${file=./myfile}
EOF

bash: : No such file or directory

当当。我想它一定是先做这>"$file"部分。但如果……呢?

unset file
<<EOF cat >"$file"
this is in ${file=./myfile}
EOF

...没有错误...?

cat ./myfile

this is in ./myfile

看来,顺序很重要。

答案3

bash创建要运行的进程时cat,它会conf在文件描述符 1 上打开以进行写入,并在文件描述符 0 上打开一个临时文件(用于此处文档)以进行读取,然后再exec执行程序。在这种情况下,这些操作发生的顺序并不重要。

当重新分配文件描述符时,顺序确实变得很重要,例如使用2>&1.

相关内容