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)
看起来,顺序很重要。