ฉันคุ้นเคยกับไวยากรณ์นี้:
cmd1 << EOF | cmd2
text
EOF
แต่เพิ่งค้นพบว่า bash ช่วยให้ฉันเขียน:
cmd1 << EOF |
text
EOF
cmd2
(heredoc ใช้เป็นอินพุตไปยัง cmd1 และเอาต์พุตของ cmd1 จะถูกส่งไปยัง cmd2) นี่ดูเหมือนไวยากรณ์ที่แปลกมาก พกพาได้ไหม
ฉันคุ้นเคยกับไวยากรณ์นี้:
cmd1 << EOF | cmd2
text
EOF
แต่เพิ่งค้นพบว่า bash ช่วยให้ฉันเขียน:
cmd1 << EOF |
text
EOF
cmd2
(heredoc ใช้เป็นอินพุตไปยัง cmd1 และเอาต์พุตของ cmd1 จะถูกส่งไปยัง cmd2) นี่ดูเหมือนไวยากรณ์ที่แปลกมาก พกพาได้ไหม
คำตอบ:
ใช่มาตรฐาน POSIX อนุญาตสิ่งนี้ ตามเวอร์ชัน 2008:
เอกสารที่นี่จะถือเป็นคำเดียวที่ขึ้นต้นหลังจากคำถัดไป
<newline>
และต่อไปจนกว่าจะมีบรรทัดที่มีเฉพาะตัวคั่นและ a<newline>
โดยไม่มี<blank>
อักขระคั่นระหว่าง จากนั้นเอกสารต่อไปนี้จะเริ่มต้นขึ้นหากมี
และรวมถึงตัวอย่างของ "เอกสารที่นี่" หลายรายการในบรรทัดเดียวกัน:
cat <<eof1; cat <<eof2
Hi,
eof1
Helene.
eof2
ดังนั้นจึงไม่มีปัญหาในการเปลี่ยนเส้นทางหรือท่อ ตัวอย่างของคุณคล้ายกับสิ่งนี้:
cat file |
cmd
และเชลล์ไวยากรณ์ (ต่อไปในหน้าที่เชื่อมโยง) รวมถึงคำจำกัดความเหล่านี้:
pipe_sequence : command
| pipe_sequence '|' linebreak command
newline_list : NEWLINE
| newline_list NEWLINE
;
linebreak : newline_list
| /* empty */
ดังนั้นสัญลักษณ์ท่อสามารถตามด้วยจุดสิ้นสุดของบรรทัดและยังถือว่าเป็นส่วนหนึ่งของไปป์ไลน์
ใช่มันอยู่ในไวยากรณ์เชลล์ POSIX นอกจากนี้คุณยังสามารถมีเอกสารที่นี่มากกว่าหนึ่งรายการสำหรับคำสั่งเดียวกัน (ตัวอย่างอื่น ๆ ใช้cat
การเรียกใช้สองครั้ง แต่ก็ใช้ได้เช่นกัน):
cat <<EOF1 <<EOF2
first here-doc
EOF1
second here-doc
EOF2
สิ่งนี้ถูกสร้างขึ้น (ใช้ 2 here-docs สำหรับ stdin) แต่ถ้าคุณคิดว่าจะให้อินพุตสำหรับตัวอธิบายไฟล์ที่แตกต่างกันมันก็สมเหตุสมผลทันที
นอกจากนี้ยังมีความเป็นไปได้ที่จะลดลงcat
อย่างสิ้นเชิง ทำไมไม่จัดเตรียมเอกสารที่นี่โดยตรงให้กับcmd
:
cmd << EOF
input
here
EOF
sudo tee /etc/securefile.conf <<EOF
นี่คือสวยหวานเมื่อใช้
อืมฉันคิดว่าใช่ตามการทดสอบใน bash ในโหมด POSIX:
$ bash --posix
$ cat <<EOF |
> ahoj
> nazdar
> EOF
> sed 's/a/b/'
bhoj
nbzdar
EOF
หลังจากที่ปิด ข้อความแจ้งจะทำงานแปลก ๆ และคุณจะสงสัยว่าเกิดอะไรขึ้น
สวัสดีตรวจสอบสิ่งนี้เช่น
#!/bin/sh
( base32 -d | base64 -d )<<ENDOFTEXT
KNDWW42DNNSHS5ZXPJCG4MSVM5MVQVT2JFCTK3DELBFDCY2IIJYGE2JUJNHWS22LINVHQMCMNVFD
CWJQIIZVUV2JOVNEOVJLINTW6PIK
ENDOFTEXT
ความนับถือ
big-long-command1 with lots of args << EOF | big-long-command2 with lots of args
ฉันมาที่นี่เพื่อหาวิธีที่ดีของการแยกนี้เป็นหลายบรรทัด: "ไวยากรณ์แปลก ๆ " ดูเหมือนจะเป็นวิธีที่ดีที่สุด