"cat> file_name << blah"コマンドを理解する方法は?

"cat> file_name << blah"コマンドを理解する方法は?

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

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

ここでコマンドの順序を理解する方法は?他のすべてbash(ここではドキュメントセクション)が最初に処理され、次に最後のステップとして> confセクションであるように見えますか?

答え1

ここのドキュメントシェルリダイレクトなので、シェルは通常からリダイレクトのように実行します。 POSIX は次のように定義します。

コマンドが複数のリダイレクト演算子を指定する場合、評価順序は最初から最後までです。


コマンドで最初に書き込み用のファイルを開いたり切り捨てたりしますcat> confconfHere-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
...

答え2

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

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

順序が重要なようです。

答え3

bashを実行するためのプロセスが作成されたら、書き込みのためにファイル記述子1でそのプロセスを開き、catプログラムを実行するconf前に、読み取るためにファイル記述子0で一時ファイル(この記事で使用されています)を開きます。execこの場合、これらの操作が実行される順序は重要ではありません。

たとえば2>&1

関連情報