What is a heredoc? Here Documents Explained | Linux Terminal 201 - HakTip 179
สารบัญ:
เมื่อเขียนเชลล์สคริปต์คุณอาจตกอยู่ในสถานการณ์ที่คุณต้องส่งบล็อคข้อความหรือรหัสหลายบรรทัดไปยังคำสั่งแบบโต้ตอบเช่น
tee
,
cat
หรือ
sftp
ใน Bash และเชลล์อื่น ๆ เช่น Zsh เอกสาร Here (Heredoc) เป็นประเภทการเปลี่ยนเส้นทางที่อนุญาตให้คุณส่งผ่านอินพุตหลายบรรทัดไปยังคำสั่ง
ไวยากรณ์ของการเขียน HereDoc ใช้แบบฟอร์มต่อไปนี้:
<< 'DELIMITER' HERE-DOCUMENT DELIMITER
- บรรทัดแรกเริ่มต้นด้วยคำสั่งทางเลือกตามด้วยโอเปอเรเตอร์การเปลี่ยนเส้นทางแบบพิเศษ
<<
และตัวคั่นที่กำหนด- คุณสามารถใช้สตริงใด ๆ เป็นตัวกำหนดที่ใช้มากที่สุดคือ EOF หรือ END หากตัวระบุการกำหนดค่าไม่ถูกอ้างอิงเชลล์จะแทนที่ตัวแปรคำสั่งและอักขระพิเศษทั้งหมดก่อนที่จะส่งบรรทัดเอกสารที่นี่ไปยังคำสั่ง เครื่องหมายลบไปที่โอเปอเรเตอร์การเปลี่ยนเส้นทาง
<<-
จะทำให้อักขระแท็บนำหน้าทั้งหมดถูกละเว้น สิ่งนี้อนุญาตให้คุณใช้การเยื้องเมื่อเขียนเอกสารที่นี่ในเชลล์สคริปต์ ไม่อนุญาตให้ใช้อักขระนำหน้าช่องว่างนำหน้าเท่านั้น
- คุณสามารถใช้สตริงใด ๆ เป็นตัวกำหนดที่ใช้มากที่สุดคือ EOF หรือ END หากตัวระบุการกำหนดค่าไม่ถูกอ้างอิงเชลล์จะแทนที่ตัวแปรคำสั่งและอักขระพิเศษทั้งหมดก่อนที่จะส่งบรรทัดเอกสารที่นี่ไปยังคำสั่ง เครื่องหมายลบไปที่โอเปอเรเตอร์การเปลี่ยนเส้นทาง
ตัวอย่าง Heredoc พื้นฐาน
ในส่วนนี้เราจะดูตัวอย่างพื้นฐานของวิธีการใช้ heredoc
Heredoc มักใช้ร่วมกับคำสั่ง cat
ในตัวอย่างต่อไปนี้เรากำลังส่งข้อความสองบรรทัดที่มีตัวแปรสภาพแวดล้อมและคำสั่งให้
cat
ใช้เอกสาร here
cat << EOF The current working directory is: $PWD You are logged in as: $(whoami) EOF
ดังที่คุณเห็นจากผลลัพธ์ด้านล่างทั้งตัวแปรและเอาต์พุตคำสั่งจะถูกแทนที่:
The current working directory is: /home/linuxize You are logged in as: linuxize
เรามาดูกันว่าจะเกิดอะไรขึ้นถ้าเราใส่ตัวคั่นไว้ในเครื่องหมายคำพูดเดี่ยวหรือคู่
cat <<- "EOF" The current working directory is: $PWD You are logged in as: $(whoami) EOF
คุณสามารถสังเกตเห็นว่าเมื่อตัวคั่นถูกยกมาไม่มีการขยายพารามิเตอร์และการทดแทนคำสั่งจะทำโดยเปลือก
The current working directory is: $PWD You are logged in as: $(whoami)
if true; then cat <<- EOF Line with a leading tab. EOF fi
Line with a leading tab.
แทนที่จะแสดงผลลัพธ์บนหน้าจอคุณสามารถเปลี่ยนเส้นทางไปยังไฟล์โดยใช้ตัวดำเนินการ
>
,
>>
cat << EOF > file.txt The current working directory is: $PWD You are logged in as: $(whoami) EOF
หากไม่มีไฟล์ file.txt มันจะถูกสร้างขึ้น เมื่อใช้
>
ไฟล์จะถูกเขียนทับในขณะที่
>>
จะผนวกเอาต์พุตไปยังไฟล์
อินพุต heredoc ยังสามารถไพพ์ได้ ในตัวอย่างต่อไปนี้คำสั่ง
sed
จะแทนที่อินสแตนซ์ทั้งหมดของอักขระ
l
ด้วย
e
:
cat <<'EOF' | sed 's/l/e/g' Hello World EOF
Heeeo Wored
ในการเขียนข้อมูล piped ไปยังไฟล์:
cat <<'EOF' | sed 's/l/e/g' > file.txt Hello World EOF
ใช้ Heredoc กับ SSH
การใช้ Heredoc เป็นหนึ่งในวิธีที่สะดวกและง่ายที่สุดในการรันคำสั่งหลายคำสั่งในระบบระยะไกลผ่าน SSH
เมื่อใช้ตัวคั่นแบบไม่มีเครื่องหมายให้แน่ใจว่าคุณได้หลีกเลี่ยงตัวแปรคำสั่งและอักขระพิเศษมิฉะนั้นจะถูกแก้ไขภายใน:
ssh -T [email protected] << EOF echo "The current local working directory is: $PWD" echo "The current remote working directory is: \$PWD" EOF
The current local working directory is: /home/linuxize The current remote working directory is: /home/user
คุณอาจต้องการตั้งค่าการรับรองความถูกต้องโดยใช้คีย์ SSH และเชื่อมต่อกับเซิร์ฟเวอร์ Linux ของคุณโดยไม่ต้องป้อนรหัสผ่าน
ข้อสรุป
ในคู่มือนี้คุณได้เรียนรู้สิ่งที่เป็น
heredoc
และวิธีการใช้ในสคริปต์เชลล์ของคุณ
ทุบตี shebang

ลำดับของตัวอักษร (!) เรียกว่า shebang และใช้เพื่อบอกระบบปฏิบัติการว่าตัวแปลใดที่จะใช้ในการแยกวิเคราะห์ส่วนที่เหลือของไฟล์