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了吗?