คำสั่ง Linux และทักษะเชลล์
Bash Scripting: จาก 'ทำงานบนกล่องของฉัน' ไปจนถึงการผลิต
Bash จะได้รับช่องเมื่องานนั้นติดหนึบ: จัดวางคำสั่ง โต้เถียงกับข้อความธรรมดา และอยู่ในกรอบทั้งหมด ชื่อเสียงในอุตสาหกรรมนี้มาจากการลงจอด ไม่ใช่แนวคิด: ไปป์ไลน์ที่ยังไม่ทดสอบถูกจัดส่งไปยัง cron บนเซิร์ฟเวอร์โดยที่ตัวแปรตัวหนึ่งไม่ได้ตั้งค่าหรือชื่อไฟล์หนึ่งมีการเว้นวรรค ระเบียบวินัยเป็นแบบกลไกและราคาถูก และมีสี่ส่วน: โหมดเข้มงวด, การอ้างอิง, การตรวจสอบเชลล์ และการบันทึกวิธีที่ ops จะอ่านในภายหลัง
ประเด็นสำคัญ
- ทุกสคริปต์ที่ร้ายแรงจะเปิดขึ้นด้วย set -euo pipefail: ตัวแปรที่ไม่ได้ตั้งค่าล้มเหลว, ความล้มเหลวของคำสั่งหยุดสคริปต์, ไปป์ไลน์อยู่บนพื้นผิว; หากไม่มีข้อผิดพลาดก็จะผ่านไปอย่างเงียบๆ จนกระทั่งถึงการใช้งานจริง
- ตัวแปรอ้างอิงและการทดแทนคำสั่ง: "$var" และ "$(cmd)"; การแยกคำบนช่องว่างถือเป็นเรื่องคลาสสิคตลอดกาล และ IFS ที่เล่นซอกับบางเว็บไซต์แนะนำนั้นเป็นข้อบกพร่องที่คุณเลือกที่จะจดจำ
- การขยายวงเล็บปีกกาเกิดขึ้นก่อนตัวแปร: rm -rf "${CLEANUP:?}"/{a,b} โดยที่ CLEANUP ไม่ได้ตั้งค่าจะขยายแตกต่างจากที่ตั้งใจไว้และลบสิ่งที่คุณตั้งใจจะเก็บไว้ การตรวจสอบ ${VAR:?} เป็นสำนวน rm-safety ที่ควรค่าแก่การเรียนรู้เพียงครั้งเดียว
- Shellcheck เข้ามาแทนที่การเปลี่ยนแปลงทุกครั้ง: โดยจับ globs ที่ไม่มีเครื่องหมายคำพูด, รหัสที่ไม่สามารถเข้าถึงได้ และรูปแบบ 'for f in $(ls)' ที่กินชื่อไฟล์ที่มีช่องว่าง; เรียกใช้ใน CI และข้อบกพร่องหยุดไปถึง cron
- งานชั่วคราวและการล้างข้อมูลได้รับการจับคู่กัน: TMP=$(mktemp -d), trap 'rm -rf "$TMP"' EXIT และไม่มี dirs รอยขีดข่วนที่ถูกละทิ้งบวกกับไม่มี 'if error then Remove' โรยบนทุกสาขา
- Read วนซ้ำด้วยวิธีที่ปลอดภัย: ในขณะที่ IFS= read -r -d '' f จัดการชื่อไฟล์ด้วยการขึ้นบรรทัดใหม่และการเว้นวรรคผ่าน find -print0; 'for f in $(ls)' คือข้อผิดพลาดของเชลล์เช็คแฟล็กและสคริปต์เก่า ๆ ที่ยังคงมีอยู่
- รหัสทางออกและบันทึกพูดถึง ops: echo failed to stderr (>&2) ด้วยชื่อบนเวที, ออกจาก nonzero เมื่อเกิดความล้มเหลวจริง, และปล่อยให้เมลหรือเจอร์นัลของ cron แสดงให้คุณเห็นหนึ่งบรรทัดที่คุณต้องการจริง ๆ ตอนตี 3
- ยกระดับตั้งแต่เนิ่นๆ: การแยกวิเคราะห์ JSON, การซ้อนระดับบวกสามระดับ, การเรียก HTTP หรือตรรกะสถานะใดๆ ที่เป็นของ Python หรือ awk bash ที่เป็นภาษาที่ใช้งานทั่วไปคือที่ที่ได้รับชื่อเสียง
บันทึกจากหน้างาน
รอยแผลเป็นจากการขยายวงเล็บปีกกาของเรา: rm -rf "${CLEANUP}"/{a,b} โดยที่ CLEANUP ไม่ได้ตั้งค่าจะขยายออกไปตามวิธีที่เชลล์ ไม่ใช่เจตนาที่ต้องการ ทุกเส้นทางเช่นนั้นตอนนี้มีผู้พิทักษ์ ${VAR:?} และไม่มีใครจ่ายบิลนั้นสองครั้ง
คำถามที่พบบ่อย
#!/bin/bash หรือ #!/usr/bin/env bash?
env ชนะในคอนเทนเนอร์และการติดตั้ง macOS โดยที่ bash อาศัยอยู่ที่อื่น shebang มีความสำคัญน้อยกว่า set -euo pipefail ที่มีอยู่จริงและเชลล์ตรวจสอบการส่งผ่านการเปลี่ยนแปลงทุกครั้ง
สคริปต์ของฉันทำงานด้วยตนเอง แต่ล้มเหลวใน cron ทำไม
Cron ทำงานในสภาพแวดล้อมเปล่าๆ: PATH สั้น ไม่มีโปรไฟล์การเข้าสู่ระบบ และเส้นทางสัมพัทธ์ชี้ไปผิดบ้าน ใช้เส้นทางที่แน่นอน ตั้งค่า PATH อย่างชัดเจน และเก็บ bash -x replay ไว้เพื่อการดีบัก
Bash หรือ Python สำหรับงานเซิร์ฟเวอร์?
ทุบตีไปป์ไลน์ที่เรียบเรียงเครื่องมือระบบที่มีอยู่เป็นส่วนใหญ่และมีขนาดเล็ก Python สำหรับข้อมูลที่มีโครงสร้าง, API และการจัดการข้อผิดพลาดที่ต้องคงอยู่เมื่อมีการโทร การบังคับให้ bash เล่น Python เป็นวิธีที่เหตุการณ์ได้รับชื่อ
ฉันจะลบสคริปต์อย่างปลอดภัยได้อย่างไร
อ้างอิงทุกตัวแปร กำหนดเป้าหมายเฉพาะพาธที่สร้างด้วย mktemp หรือที่กำหนดค่าไว้อย่างชัดเจน รันด้วยโหมดดรายรันที่พิมพ์สิ่งที่จะลบออก และปล่อยให้ ${VAR:?} ป้องกันยับยั้งยกเลิกการตั้งค่าตัวแปรก่อนที่ rm จะเห็นตัวแปรเหล่านั้น
Kinetikatech ช่วยเรื่อง คำสั่ง linux และทักษะเชลล์ ได้อย่างไร
นี่คือสิ่งที่เราทำทุกวัน: คำสั่งและพฤติกรรมการเขียนสคริปต์ที่ตัดสินใจว่าผู้ดูแลระบบจะใช้งานเซิร์ฟเวอร์หรือต่อสู้กับเซิร์ฟเวอร์: ค้นหา แปลง ถ่ายโอน และดูแลข้อความและกระบวนการด้วยเครื่องมือที่อยู่ในทุกการติดตั้งฐาน บริการ ความปลอดภัยเซิร์ฟเวอร์ Linuxและการจัดการเซิร์ฟเวอร์ ของเราดูแลครบวงจร ตั้งแต่ประเมิน ลงมือทำ ติดตาม 24 ชั่วโมง ไปจนถึงรับเรื่องฉุกเฉินภายใน 30 นาที