เหตุใดคำสั่งmd5sum <<< 'ddd'
(เอาต์พุต:) d6d88f2e50080b9602da53dac1102762 -
ถูกต้องและmd5sum << 'ddd'
ไม่ใช่
อะไร<<<
หมายความว่าอย่างไร
เหตุใดคำสั่งmd5sum <<< 'ddd'
(เอาต์พุต:) d6d88f2e50080b9602da53dac1102762 -
ถูกต้องและmd5sum << 'ddd'
ไม่ใช่
อะไร<<<
หมายความว่าอย่างไร
คำตอบ:
<<<
เริ่มต้นเป็น“ที่นี่สตริง”: สตริงจะขยายตัวและเลี้ยง stdin ของโปรแกรม (ในกรณีของคุณมีการขยายเกิดขึ้นไม่มาก) ซึ่งเทียบเท่ากับสิ่งนี้:
echo ddd | md5sum
ในทางกลับกัน<<
เริ่มเอกสารที่นี่ บรรทัดต่อไปนี้ทั้งหมดที่มีเครื่องหมายระบุddd
จะประกอบด้วยอินพุตของโปรแกรม (คุณควรใช้เครื่องหมายที่ไม่น่าจะปรากฏในข้อมูลของคุณ) คุณสามารถได้รับผลเช่นเดียวกับด้านบนดังนี้:
md5sum <<END
ddd
END
มีความแตกต่างหนึ่งอย่างระหว่าง<<END
และ<<'END'
: หากไม่มีเครื่องหมายคำพูดตัวแปรใด ๆ ลำดับหนี ฯลฯ ในเอกสารที่นี่จะถูกขยายตามปกติ
<<<
แนะนำสตริงที่นี่ : สตริงหลังจาก<<<
ถูกส่งผ่านเป็นอินพุตไปยังคำสั่ง สิ่งนี้มีต้นกำเนิดในพอร์ตของ Byron Rakitzis ของrc
(แผนที่ 9 shell) ไปยัง Unix และยังมีอยู่ใน zsh, ksh93 และ bash
<<
แนะนำเอกสาร here : บรรทัดที่ตามมาของเชลล์สคริปต์จะถูกส่งผ่านเป็นอินพุตไปยังคำสั่งและสตริงหลังจาก<<
นั้นเป็น terminator ที่นี่เอกสารทำงานในเชลล์สไตล์ Bourne ทั้งหมด (Bourne, POSIX, Ash, bash, ksh, zsh, …), เชลล์ C-style (csh, tcsh) และ Plan 9 shell (rc, es)
<<<
ไม่ใช่ksh
ส่วนขยายเส้นทางคือrc
-> zsh
-> ksh93
-> bash
( ksh
บันทึกย่อประจำรุ่นรับทราบเมื่อยืมคุณสมบัติจากzsh
) <<
ยังใช้งานได้ในrc
เปลือกหอยสไตล์
rc
และzsh
<<<
แม้ว่าในนั้นrc
จะไม่รวมอักขระบรรทัดใหม่ต่อท้ายและไม่ใช้ไฟล์ temp (ใช้ไพพ์และกระบวนการพิเศษที่ป้อนอย่างน้อยในพอร์ตไปยัง Linux)
<<<
มาจากพอร์ต Unix rc
เนื่องจากดูไม่เหมือน Plan9 ที่rc
มี
rc
,<<<
(ชอบ<<
) ใช้ไฟล์ชั่วคราวเพื่อให้สามารถใช้งานโดยคำสั่งที่lseek
stdin ของพวกเขา