在以下命令中,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
.