Answers:
Here-Document是一种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
...
open被叫过dup2。
当bash创建要运行的进程时cat,在打开程序之前,它将打开conf以写入文件描述符1并打开一个临时文件(用于本文档)以读取文件描述符0 exec。在这种情况下,这些动作的发生顺序并不重要。
重新分配文件描述符时,顺序确实变得很重要,例如使用2>&1。
cat > file_name << blah是,在执行shellcat的stdout之前将其连接到named文件file_name,然后将shell的stdin连接至here-doc了吗?