Bagaimana cara memahami perintah "cat> file_name << blah"?

13

Dalam perintah berikut, kucing mengambil konten di sini-doc dan mengalihkannya ke file bernama conf:

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

Bagaimana cara memahami urutan perintah di sini? Apakah bashproses pertama yang lainnya (di sini-doc bagian) dan sebagai langkah terakhir terlihat > confbagian?

Martin
sumber

Jawaban:

17

Di sini-Dokumen adalah semacam pengalihan shell, sehingga shell akan melakukan pengalihan seperti biasa, dari awal hingga akhir (atau dari kiri ke kanan, atau urutan penampilan). Ini ditentukan oleh POSIX:

Jika lebih dari satu operator pengalihan ditentukan dengan perintah, urutan evaluasi adalah dari awal hingga akhir.


Pada perintah Anda, catakan melakukan > confpertama, membuka dan memotong conffile untuk menulis, kemudian membaca data dari Here-Document.

Menggunakan strace, Anda dapat memverifikasinya:

$ 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
...
cuonglm
sumber
Saya melihat. Jadi pada dasarnya apa yang terjadi dalam kasus cat > file_name << blahini bahwa sebelum mengeksekusi catpara stdout dari shell terhubung ke file bernama file_namedan kemudian stdin dari shell terhubung ke sini-doc ?
Martin
@ Martin: Ya. Anda dapat melihat opendipanggil sebelumnya dup2.
cuonglm
12

Baiklah, mari kita cari tahu:

unset file
cat >"$file" <<EOF
this is not in ${file=./myfile}
EOF

bash: : No such file or directory

Dang. Saya kira itu harus melakukan >"$file"bagian itu dulu. Tetapi bagaimana jika ...?

unset file
<<EOF cat >"$file"
this is in ${file=./myfile}
EOF

... tidak ada kesalahan ...?

cat ./myfile

this is in ./myfile

Seperti yang terlihat, pesanan penting.

mikeserv
sumber
-1

Ketika bashmembuat proses untuk dijalankan cat, itu terbuka confuntuk menulis pada deskriptor file 1 dan membuka file sementara (untuk dokumen-di sini) untuk dibaca pada deskriptor file 0, sebelum execing program. Dalam hal ini, tidak masalah urutan tindakan itu terjadi.

Urutan menjadi signifikan ketika deskriptor file dipindahkan, misalnya dengan 2>&1.

Toby Speight
sumber