รายละเอียด Running Bash ครับ

หากคุณพบหน้านี้ในการค้นหา คุณอาจกำลังพยายามแก้ไขปัญหาบางอย่างเกี่ยวกับการรัน bash

บางทีสภาพแวดล้อม bash ของคุณไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อมและคุณไม่เข้าใจว่าทำไม คุณอาจติดอะไรบางอย่างในไฟล์ bash boot หรือโปรไฟล์ต่างๆ หรือไฟล์ทั้งหมดแบบสุ่มจนกว่าจะได้ผล

ไม่ว่าในกรณีใด ประเด็นของบันทึกนี้คือการวางขั้นตอนการเริ่มทุบตีให้ง่ายที่สุดเท่าที่จะเป็นไปได้เพื่อให้คุณสามารถจัดการกับปัญหาได้

Диаграмма

ผังงานนี้จะสรุปกระบวนการทั้งหมดเมื่อรัน bash

รายละเอียด Running Bash ครับ

ทีนี้เรามาดูแต่ละส่วนกันดีกว่า

เข้าสู่ระบบเชลล์?

ก่อนอื่นคุณต้องเลือกว่าคุณอยู่ในเชลล์การเข้าสู่ระบบหรือไม่

เชลล์การเข้าสู่ระบบเป็นเชลล์แรกที่คุณป้อนเมื่อคุณเข้าสู่ระบบเซสชันแบบโต้ตอบ เชลล์การเข้าสู่ระบบไม่จำเป็นต้องมีชื่อผู้ใช้และรหัสผ่าน คุณสามารถบังคับให้เชลล์ล็อกอินเริ่มต้นด้วยการเพิ่มแฟล็ก --login เมื่อถูกเรียก bashตัวอย่างเช่น:

ทุบตี --login

เชลล์ล็อกอินจะตั้งค่าสภาพแวดล้อมพื้นฐานเมื่อคุณเริ่ม bash เชลล์เป็นครั้งแรก

เชิงโต้ตอบ?

จากนั้นคุณจะพิจารณาว่าเชลล์เป็นแบบโต้ตอบหรือไม่

ซึ่งสามารถตรวจสอบได้โดยการมีอยู่ของตัวแปร PS1 (ติดตั้งฟังก์ชันอินพุตคำสั่ง):

ถ้า [ "${PS1-}" ]; จากนั้นก้องแบบโต้ตอบอย่างอื่นสะท้อน fi แบบไม่โต้ตอบ

หรือดูว่าตั้งค่าตัวเลือกไว้หรือไม่ -iโดยใช้ตัวแปรยัติภังค์พิเศษ - ใน bash เช่น:

$เอคโค$-

หากมีสัญลักษณ์อยู่ในเอาท์พุต iจากนั้นเชลล์จะโต้ตอบได้

ในเปลือกเข้าสู่ระบบ?

หากคุณอยู่ในเชลล์การเข้าสู่ระบบ bash จะค้นหาไฟล์ /etc/profile และทำงานถ้ามันมีอยู่

จากนั้นค้นหาไฟล์ใด ๆ ในสามไฟล์เหล่านี้ตามลำดับต่อไปนี้:

~/.bash_profile ~/.bash_login ~/.profile

เมื่อพบสิ่งใดสิ่งหนึ่ง มันจะเริ่มต้นและข้ามสิ่งอื่น ๆ

ในเชลล์แบบโต้ตอบ?

หากคุณอยู่ในเชลล์ที่ไม่ใช่การเข้าสู่ระบบ จะถือว่าคุณอยู่ในเชลล์การเข้าสู่ระบบแล้ว สภาพแวดล้อมได้รับการกำหนดค่าและจะได้รับการสืบทอด

ในกรณีนี้ สองไฟล์ต่อไปนี้จะถูกดำเนินการตามลำดับ หากมี:

/etc/bash.bashrc ~/.bashrc

ไม่มีทางเลือกเหรอ?

หากคุณไม่ได้อยู่ในเชลล์การเข้าสู่ระบบหรือเชลล์แบบโต้ตอบ สภาพแวดล้อมของคุณจะว่างเปล่าอย่างแน่นอน สิ่งนี้ทำให้เกิดความสับสนมาก (ดูด้านล่างเกี่ยวกับงาน cron)

ในกรณีนี้ bash จะดูที่ตัวแปร BASH_ENV สภาพแวดล้อมของคุณและสร้างไฟล์ที่เกี่ยวข้องซึ่งระบุไว้ที่นั่น

ปัญหาทั่วไปและกฎเกณฑ์ของ Thumb

งานครอน

95% ของเวลาที่ฉันดีบักการเริ่มต้น bash เป็นเพราะงาน cron ไม่ทำงานตามที่คาดไว้

ภารกิจบ้าๆ นี่ ทำงานได้ดีเมื่อฉันรันบนบรรทัดคำสั่ง แต่จะล้มเหลวเมื่อฉันรันใน crontab.

ที่นี่ สองเหตุผล:

  • งาน Cron ไม่มีการโต้ตอบ
  • ไม่เหมือนกับสคริปต์บรรทัดคำสั่ง งาน cron จะไม่สืบทอดสภาพแวดล้อมของเชลล์

โดยทั่วไปแล้ว คุณจะไม่สังเกตเห็นหรือสนใจว่าเชลล์สคริปต์ไม่มีการโต้ตอบ เนื่องจากสภาพแวดล้อมสืบทอดมาจากเชลล์แบบโต้ตอบ ซึ่งหมายความว่าทุกสิ่งทุกอย่าง PATH и alias กำหนดค่าตามที่คุณคาดหวัง

ด้วยเหตุนี้จึงมักจำเป็นต้องตั้งค่าเฉพาะเจาะจง PATH สำหรับงาน cron เช่นที่นี่:

* * * * * PATH=${PATH}:/path/to/my/program/folder myprogram

สคริปต์เรียกหากัน

ปัญหาทั่วไปอีกประการหนึ่งคือเมื่อมีการกำหนดค่าสคริปต์ให้โทรหากันโดยไม่ตั้งใจ ตัวอย่างเช่น, /etc/profile อุทธรณ์ไปยัง ~/.bashrc.

สิ่งนี้มักเกิดขึ้นเมื่อมีคนพยายามแก้ไขข้อผิดพลาดและทุกอย่างดูเหมือนจะได้ผล น่าเสียดายที่เมื่อคุณต้องการแยกเซสชันประเภทต่างๆ เหล่านี้ ปัญหาใหม่ก็เกิดขึ้น

รูปภาพ Docker ที่ทำแซนด์บ็อกซ์

เพื่อทดลองรันเชลล์ ฉันได้สร้างอิมเมจ Docker ที่สามารถใช้เพื่อดีบักการรันเชลล์ในสภาพแวดล้อมที่ปลอดภัย

ปล่อย:

$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash

Dockerfile ตั้งอยู่ ที่นี่.

หากต้องการบังคับเข้าสู่ระบบและจำลองเปลือกเข้าสู่ระบบ:

$ bash --login

เพื่อทดสอบชุดของตัวแปร BASH_ENV:

$ env | grep BASH_ENV

สำหรับการดีบัก crontab สคริปต์อย่างง่ายจะถูกดำเนินการทุกนาที (ใน /root/ascript):

$ crontab -l
$ cat /var/log/script.log

ที่มา: will.com

เพิ่มความคิดเห็น