ตัวอย่างต่อไปนี้แสดงให้เห็นว่าการขึ้นบรรทัดใหม่จะถูกเพิ่มที่นี่สตริง
ทำไมถึงทำเช่นนี้?
xxd -p <<<'a'
# output: 610a
xxd -p <<<'a
'
# output: 610a0a
ตัวอย่างต่อไปนี้แสดงให้เห็นว่าการขึ้นบรรทัดใหม่จะถูกเพิ่มที่นี่สตริง
ทำไมถึงทำเช่นนี้?
xxd -p <<<'a'
# output: 610a
xxd -p <<<'a
'
# output: 610a0a
คำตอบ:
คำตอบที่ง่ายคือเนื่องจาก ksh เขียนขึ้นในลักษณะนั้น (และ bash เข้ากันได้) แต่มีเหตุผลสำหรับตัวเลือกการออกแบบนั้น
คำสั่งส่วนใหญ่คาดว่าจะป้อนข้อความ ในโลกยูนิกซ์แฟ้มข้อความประกอบด้วยลำดับของสายแต่ละสิ้นสุดในบรรทัดใหม่ ดังนั้นในกรณีส่วนใหญ่ต้องขึ้นบรรทัดใหม่ขั้นสุดท้าย กรณีทั่วไปโดยเฉพาะอย่างยิ่งคือการคว้าเอาท์พุทของคำสั่งด้วยคำสั่ง susbtitution ประมวลผลมันในทางใดทางหนึ่งแล้วส่งไปยังคำสั่งอื่น การทดแทนคำสั่งตัดการขึ้นบรรทัดใหม่ขั้นสุดท้าย <<<
วางกลับหนึ่ง
tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp
Bash และ ksh ไม่สามารถจัดการกับข้อมูลไบนารี่ได้ (มันไม่สามารถรับมือกับตัวละครที่ไม่มีค่า null) ได้ดังนั้นจึงไม่น่าแปลกใจที่สิ่งอำนวยความสะดวกของพวกเขาจะมุ่งเน้นไปที่ข้อมูลตัวอักษร
<<<
ไวยากรณ์ที่นี่สตริงส่วนใหญ่จะเป็นเพียงเพื่อความสะดวกสบายอยู่แล้วเช่น<<
ที่นี่เอกสาร หากคุณไม่ต้องการเพิ่มบรรทัดใหม่ให้ใช้echo -n
(เป็น bash) หรือprintf
และไปป์ไลน์
<<<
ได้รับการแนะนำให้รู้จักกับโลกโดยบอร์นไม่ได้zsh
ksh
และมันก็ได้รับแรงบันดาลใจจากโอเปอเรเตอร์ที่คล้ายกันในพอร์ต Unix rc
ซึ่งไม่ได้เพิ่มอักขระบรรทัดใหม่พิเศษนั้น น่าสนใจ=(<<<text)
ผู้ประกอบการจะไม่เพิ่มบรรทัดใหม่zsh
นั้น
printf
ฯลฯ ) เพื่อหลีกเลี่ยงการขึ้นบรรทัดใหม่ในส่วนท้ายbash
หรือไม่? Like @ StéphaneChazelasแหลมเป็นไปได้zsh
ค่ะ
สถานการณ์หนึ่งที่เป็นประโยชน์ในการเพิ่มบรรทัดใหม่ต่อท้ายที่นี่คือการใช้read
คำสั่งเมื่อset -e
โหมดใช้งานอยู่ เรียกคืนที่set -e
ทำให้สคริปต์หยุดทำงานเมื่อมีการใช้คำสั่ง (มากหรือน้อย) ที่สร้างรหัสสถานะที่ไม่เป็นศูนย์ พิจารณาว่าread
จะสร้างรหัสสถานะที่ไม่เป็นศูนย์เมื่อพบสตริงโดยไม่มีการขึ้นบรรทัดใหม่:
#!/bin/bash
set -e
# The following statement succeeds because here-strings append a newline:
IFS='' read -r <<< 'newline appended'
echo 'Made it here'
# The following statement fails because 'read' returns a non-zero status
# code when no newlines are encountered.
printf 'no newline' | IFS='' read -r
echo 'Did not make it here'
ฉันคิดว่านั่นเป็นวิธีเดียวที่จะได้รับการขึ้นบรรทัดใหม่ในตอนท้ายของสตริงที่นี่พิสูจน์:
xxd <<<`echo -ne "a\n"`
ดูเหมือนว่าผู้ประกอบการที่นี่สตริงตัดบรรทัดใหม่ยกเว้นว่าพวกเขาจะได้รับในไวยากรณ์ที่คุณส่ง
xxd <<<$(echo a)
คุณสามารถลดความซับซ้อนนี้