「cat> file_name << blah」コマンドの理解方法


13

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

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

ここでコマンドの順序を理解する方法は?いbash最初のプロセスのすべての他の(ここでは-docの部分)と最終ステップとしては、それが見える> conf部分を?

回答:


17

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

そうですか。そこで、基本的の場合に何が起こるかcat > file_name << blahということを実行する前にされた標準出力という名前のファイルに接続されているシェルのを当時と標準入力殻に接続され、ここで-docのcatfile_name
マーティン

@マーティン:はい。open前に呼び出されたことがわかりdup2ます。
クオンルム

12

それでは、調べてみましょう。

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

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


-1

ときbashに実行するプロセスを作成しcat、それが開きますconfファイルディスクリプタ1の書き込みのためにと前に、ファイルディスクリプタ0上の読み取りのために(ここでは、文書の)一時ファイルを開くexecプログラムをする。この場合、これらのアクションが発生する順序は実際には関係ありません。

ファイル記述子が再割り当てされた場合、たとえばで順序が重要になります2>&1

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.