回答:
Here-Documentは一種のシェルリダイレクトであるため、シェルは最初から最後へ(または左から右へ、または表示順)通常のリダイレクトとして実行します。これは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
ます。
それでは、調べてみましょう。
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
表示されるように、順序が重要です。
cat > file_name << blah
ということを実行する前にされた標準出力という名前のファイルに接続されているシェルのを当時と標準入力殻に接続され、ここで-docの?cat
file_name