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


13

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

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

如何在这里了解命令的顺序?bash首先是否要处理其他所有内容(here-doc部分),最后看是否要处理> conf

Answers:


17

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
...

我知道了。因此,基本上发生的情况cat > file_name << blah是,在执行shell catstdout之前将其连接到named文件file_name,然后将shell的stdin连接至here-doc了吗?
马丁

@马丁:是的。您可以看到open被叫过dup2
cuonglm

12

好吧,让我们找出:

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

bash: : No such file or directory

ang 我想那一定是>"$file"第一位。但是,如果...?

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

...没有错误...?

cat ./myfile

this is in ./myfile

看起来,顺序很重要。


-1

bash创建要运行的进程时cat,在打开程序之前,它将打开conf以写入文件描述符1并打开一个临时文件(用于本文档)以读取文件描述符0 exec。在这种情况下,这些动作的发生顺序并不重要。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.