Saya kenal dengan sintaks ini:
cmd1 << EOF | cmd2
text
EOF
tetapi baru saja menemukan bahwa bash memungkinkan saya untuk menulis:
cmd1 << EOF |
text
EOF
cmd2
(heredoc digunakan sebagai input ke cmd1, dan output dari cmd1 disalurkan ke cmd2). Sepertinya ini sintaks yang sangat aneh. Apakah ini portabel?
big-long-command1 with lots of args << EOF | big-long-command2 with lots of args
. "Sintaks ganjil" sepertinya cara terbaik.Jawaban:
Ya, standar POSIX memungkinkan ini. Menurut versi 2008:
Dan termasuk contoh beberapa "dokumen-sini" di baris yang sama:
Jadi tidak ada masalah melakukan pengalihan atau pipa. Contoh Anda mirip dengan sesuatu seperti ini:
Dan tata bahasa shell (lebih jauh ke bawah pada halaman tertaut) mencakup definisi ini:
Jadi simbol pipa dapat diikuti oleh end-of-line dan masih dianggap sebagai bagian dari pipa.
sumber
Ya itu ada dalam tata bahasa shell POSIX. Anda juga dapat memiliki lebih dari satu dokumen di sini untuk perintah yang sama (beberapa contoh lain menggunakan dua
cat
pemanggilan, tetapi ini juga berfungsi):Ini dibuat-buat (menggunakan 2 di sini-docs untuk stdin), tetapi jika Anda berpikir untuk memberikan input untuk deskriptor file yang berbeda segera masuk akal.
Ada juga kemungkinan untuk menjatuhkan
cat
seluruhnya . Mengapa tidak membuat dokumen di sini langsung tersedia untukcmd
:sumber
sudo tee /etc/securefile.conf <<EOF
.Hmm, saya kira ya, menurut tes di bash dalam mode POSIX:
sumber
EOF
. Prompt akan bertingkah aneh dan Anda akan bertanya-tanya apa yang salahHai, periksa ini, misalnya
salam
sumber