หากคุณพบหน้านี้ในการค้นหา คุณอาจกำลังพยายามแก้ไขปัญหาบางอย่างเกี่ยวกับการรัน bash
บางทีสภาพแวดล้อม bash ของคุณไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อมและคุณไม่เข้าใจว่าทำไม คุณอาจติดอะไรบางอย่างในไฟล์ bash boot หรือโปรไฟล์ต่างๆ หรือไฟล์ทั้งหมดแบบสุ่มจนกว่าจะได้ผล
ไม่ว่าในกรณีใด ประเด็นของบันทึกนี้คือการวางขั้นตอนการเริ่มทุบตีให้ง่ายที่สุดเท่าที่จะเป็นไปได้เพื่อให้คุณสามารถจัดการกับปัญหาได้
Диаграмма
ผังงานนี้จะสรุปกระบวนการทั้งหมดเมื่อรัน 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