web-dev-qa-db-ja.com

「cat> file_name << blah」コマンドを理解するには?

次のコマンドでは、catはhere-docのコンテンツを取得して、confという名前のファイルにリダイレクトします。

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

ここでコマンドの順序を理解するにはどうすればよいですか? bashは最初に他のすべて(ヒアドキュメント部分)を処理し、最後のステップとして> conf一部?

13
Martin

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

さて、調べてみましょう:

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

表示されるように、順序は重要です。

12
mikeserv