ทำไมเราถึงมี bash shell เข้าสู่ระบบ, ไม่โต้ตอบ, และไม่โต้ตอบ?


23

ดังนั้นคนทุบตีหน้าอธิบายการเข้าสู่ระบบและเปลือกโต้ตอบ:

เปลือกเข้าสู่ระบบเป็นหนึ่งที่มีอักขระตัวแรกของศูนย์อาร์กิวเมนต์เป็น - หรือหนึ่งเริ่มต้นด้วยตัวเลือก --login

เชลล์แบบโต้ตอบเริ่มต้นหนึ่งโดยไม่มีอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือกและไม่มีตัวเลือก -c ซึ่งทั้งอินพุตและข้อผิดพลาดมาตรฐานเชื่อมต่อกับเทอร์มินัล (ตามที่กำหนดโดย isatty (3)) หรือเริ่มด้วยตัวเลือก -i มีการตั้งค่า PS1 และ $ - รวม i หาก bash เป็นแบบโต้ตอบอนุญาตให้เชลล์สคริปต์หรือไฟล์เริ่มต้นเพื่อทดสอบสถานะนี้

ฉันคิดว่านี่หมายความว่าเราสามารถมีกระสุนได้ 4 แบบ:

  • เชลล์ล็อกอินแบบโต้ตอบ
  • เชลล์ล็อกอินที่ไม่โต้ตอบ
  • เชลล์ที่ไม่ใช่การล็อกอินแบบโต้ตอบ
  • เชลล์ที่ไม่ใช่การล็อกอินแบบไม่โต้ตอบ

แต่ทำไมเราถึงมีเชลล์แบบตอบโต้ / ไม่โต้ตอบและล็อกอิน / ไม่ใช่เข้าสู่ระบบในตอนแรก? ทำไมต้องเป็นวาไรตี้? เราจะเสียอะไรถ้าเรามีเปลือกประเภทเดียว

นอกจากนี้เมื่อพยายามที่จะตรวจสอบว่าฉันอยู่ในเปลือกเข้าสู่ระบบโดยการเรียกใช้echo $-มันก็ส่งออก:

himBH

บางส่วนของสถานะเหล่านี้มีการอธิบายที่นี่แต่h, Hและmไม่ได้อธิบาย มีสถานที่ที่อธิบายธงเหล่านี้ทั้งหมดหรือไม่

คำตอบ:


21

นี่เป็นความคิดของฉันเกี่ยวกับ "ประเภท" กระสุนที่แตกต่างกัน - โชคไม่ดีที่ฉันไม่ได้เห็นการเพิ่มขึ้นของ Un * x ตั้งแต่เริ่มต้น (ฉันคิดว่าแนวคิดนี้มีการเติบโตในอดีตไปจนถึงการขยายตัวที่ดี)

  • เมื่อฉันเข้าสู่ระบบ (ปัจจุบันผ่านทางเข้าสู่ระบบกราฟิก X) อาจมีงานบางอย่างที่ควรทำงานครั้งเดียวเช่นสร้างการเชื่อมต่อกับเซิร์ฟเวอร์บางชนิดนำเสนอรายการสิ่งที่ต้องทำของวันนี้เริ่มต้นคำสั่งอัตโนมัติบางอย่างเป็นต้น ไม่ควรมีความสุขทุกครั้งที่ฉันเปิดเครื่องใหม่ ดังนั้นจึงมีชุดของ config ไฟล์ ( /etc/profile, ~/.bash_loginและอื่น ๆ โปรดดูที่คู่มือสำหรับรายชื่อที่ถูกต้อง) มาโดยเฉพาะการเข้าสู่ระบบเปลือกหอย
  • ดังนั้นเมื่อต้องการปิดการเชื่อมต่อให้ฆ่าบางโปรแกรมเรียกใช้สคริปต์สำรองที่มี~/.bash_logoutเมื่อเชลล์ล็อกอินมีอยู่
  • ดังนั้นเชลล์ "ปกติ" ที่ฉันใช้ในเทอร์มินัลไม่ควรเป็นเชลล์ล็อกอินแต่ควรอ่านการตั้งค่าส่วนบุคคลของฉัน~/.bashrcเพราะฉันต้องการให้ปุ่มลัดของฉันโต้ตอบกับเชลล์ - ดังนั้นนี่คือการโต้ตอบที่ไม่ใช่เชลล์ล็อกอิน
  • และสุดท้าย แต่ไม่ท้ายสุดเมื่อใช้ bash สำหรับการเขียนสคริปต์สิ่งเหล่านี้ไม่สำคัญ bashควรเริ่มเร็วเท่าที่จะทำได้เช่นไม่ควรอ่านไฟล์ปรับแต่งใด ๆ นี่คือไม่ใช่แบบโต้ตอบที่ไม่ใช่การเข้าสู่ระบบเปลือก

ดังนั้นคำตอบสำหรับคำถามของคุณเราจะเสียอะไรถ้าเรามีเปลือกประเภทเดียว อยู่ในคำเดียว: "ความยืดหยุ่น"


คำตอบสำหรับคำถามที่สองของคุณเป็นเรื่องง่าย:

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

  • OPTIONS มาตรา:

    -i        If the -i option is present, the shell is interactive.
  • SHELL BUILTIN COMMANDSส่วนย่อยset:

    -h      Remember the location of commands as they are looked up for execution.  This is enabled by default.
    -m      Monitor  mode.  Job control is enabled.  This option is on by default for interactive shells on systems that sup
            port it (see JOB CONTROL above).  Background processes run in a separate process  group  and  a  line  containing
            their exit status is printed upon their completion.
    -B      The shell performs brace expansion (see Brace Expansion above).  This is on by default.
    -H      Enable !  style history substitution.  This option is on by default when the shell is interactive.

1
Woo ฉันเชื่อว่า @mpy ตอบคำถามที่กำหนดไว้อย่างชัดเจนของ OP สามารถที่จะอธิบายความหมายที่มีประโยชน์ได้อย่างสมบูรณ์ เกี่ยวกับสิ่งนั้น: เชลล์ที่ไม่ใช่การเข้าสู่ระบบเป็นเพียงเซตย่อยของล็อกอินเชลล์ใช่ไหม?
tuk0z
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.