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

Mar*_*tin 14 shell bash here-document

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

cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF
Run Code Online (Sandbox Code Playgroud)

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

cuo*_*glm 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
...
Run Code Online (Sandbox Code Playgroud)


mik*_*erv 12

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

unset file
cat >"$file" <<EOF
this is not in ${file=./myfile}
EOF
Run Code Online (Sandbox Code Playgroud)
bash: : No such file or directory
Run Code Online (Sandbox Code Playgroud)

党。我想它必须先做这个>"$file"部分。但是如果……怎么办?

bash: : No such file or directory
Run Code Online (Sandbox Code Playgroud)

……没有错误……?

cat ./myfile
Run Code Online (Sandbox Code Playgroud)
this is in ./myfile
Run Code Online (Sandbox Code Playgroud)

看起来,顺序很重要。