ฉันเปิดเทอร์มินัลบน Ubuntu โดยใช้Ctrl+ Alt+ Tและเทอร์มินัลอื่นโดยไปที่ไดเรกทอรีแล้วคลิกขวาและเลือก "เปิดในเทอร์มินัล"
ฉันทำecho $0ทั้งสองกรณี
ในกรณีแรก:
$ echo $0
-bash
ในกรณีที่สอง:
$ echo $0
/bin/bash
ทำไมความแตกต่างนี้
ฉันเปิดเทอร์มินัลบน Ubuntu โดยใช้Ctrl+ Alt+ Tและเทอร์มินัลอื่นโดยไปที่ไดเรกทอรีแล้วคลิกขวาและเลือก "เปิดในเทอร์มินัล"
ฉันทำecho $0ทั้งสองกรณี
ในกรณีแรก:
$ echo $0
-bash
ในกรณีที่สอง:
$ echo $0
/bin/bash
ทำไมความแตกต่างนี้
คำตอบ:
หากเอาต์พุตของecho $0คำสั่งคือ-bashหมายความว่า bashถูกเรียกใช้เป็นเชลล์ล็อกอิน หากเอาต์พุตเป็นเพียงแสดงbashว่าคุณอยู่ในเชลล์ที่ไม่ใช่การล็อกอิน
man bash พูดที่บรรทัดที่ 126:
A login shell is one whose first character of argument zero is a -, or one started with the --login option.
ดูเพิ่มเติมเกี่ยวกับที่นี่: ความแตกต่างระหว่างล็อกอินเชลล์และเชลล์ที่ไม่ใช่ล็อกอินใช่หรือไม่ .
ตอนนี้เพื่ออธิบายว่าทำไมคุณถึงได้/bin/bashในกรณีที่สองฉันสามารถพูดได้ว่าโปรแกรม (ในกรณีของคุณคือตัวจัดการไฟล์ของคุณอาจเป็นหอยโข่ง) หรือสคริปต์สามารถเปลี่ยนของตัวเอง$0เป็นอย่างอื่นได้ เป็นตัวอย่างดูสิ่งที่เกิดขึ้น$0ใน terminal ของฉัน (terminal เดียวกันตลอดเวลา):

ความแตกต่างอยู่ที่วิธีการเริ่มต้นเหล่านี้ ทุบตีจะเริ่มต้นแตกต่างกัน (อ่านสคริปต์เริ่มต้นที่แตกต่างกัน) ขึ้นอยู่กับมัน argv [0] หากสตริงเริ่มต้นด้วยเครื่องหมายยัติภังค์-เหมือนใน-bashนั้นมันจะทำงานเป็นเปลือกเข้าสู่ระบบถ้าไม่มันจะทำงานเป็นเปลือกโต้ตอบ นอกจากนี้ยังสามารถเรียกใช้เป็นเชลล์แบบไม่มีการโต้ตอบ (เช่นในเชลล์สคริปต์)
หากต้องการข้อมูลเพิ่มเติมควรอ่านคู่มือman bashส่วน INVOCATION
เปลือกจะเริ่มต้นเมื่อคุณเข้าสู่ระบบ แต่ก็ยังตั้งขึ้นโดยโปรแกรมเช่นmakeหรือเมื่อคุณเรียกใช้สคริปต์เปลือกหรือเมื่อคุณพิมพ์:shไปviหรือเมื่อคุณสร้างหน้าต่างอาคารผู้โดยสารแห่งใหม่
แต่เดิมเปลือกอ่านในเมื่อคุณเข้าสู่ระบบหรือวิ่ง~/.profile suสคริปต์นี้จะทำสิ่งต่าง ๆ เช่นประกาศว่าคุณมีอีเมลใหม่ปรับแต่งการลบและฆ่าตัวละครและตั้งค่าและส่งออกตัวแปร TERM และ PATH เมื่อเริ่มต้นในบริบทอื่น ๆ เกือบเปลือกไม่ได้อ่าน~/.profileเพราะทำสิ่งเหล่านั้นส่วนใหญ่จะซ้ำซ้อน คุณคาดว่าจะส่งออกตัวแปรเชลล์ที่สำคัญไปยังเชลล์ใหม่
วิธีการที่เปลือกรู้ว่าจะอ่าน~/.profileคือการตรวจสอบว่าตัวอักษรตัวแรกของargv[0]อาคาเป็น$0'-'
เริ่มต้นด้วยcshนามแฝงถูกนำมาใช้ นามแฝงไม่ถูกส่งออกในสภาพแวดล้อม cshถูกออกแบบมาเพื่ออ่านในสองสคริปต์เริ่มต้นที่แตกต่างกัน ~/.loginถูกอ่านเมื่อผู้ใช้เข้าสู่ระบบและคิวในการทำเช่นนี้คือถ้าargv[0]'-'เริ่มต้นด้วย ~/.cshrcถูกอ่านทุกครั้งที่เชลล์เริ่มทำงาน โดยทั่วไปแล้วหนึ่งชื่อแทนใน~/.cshrcและทุกอย่างอื่น~/.loginมา cshนอกจากนี้ยังได้รับการสนับสนุนซึ่งในกรณีส่วนใหญ่เพียงแค่ล้างหน้าจอและวิ่ง~/.logoutfortune
เชลล์อื่น ๆ ใช้คุณสมบัติเดียวกันนี้ kshจะอ่านใน~/.kshrc, bashจะอ่าน~/.bashrcและผู้ที่ถูกที่คุณต้องการวางคำจำกัดความนามแฝงของคุณ
ดังนั้นเพื่อให้เรื่องราวสั้น ๆ แอปพลิเคชั่นที่วางไข่เชลล์จะตัดสินใจว่าควรจะเป็น "ล็อกอินเชลล์" หรือไม่ในกรณีนี้จะมี'-'จุดเริ่มต้นหรือเชลล์ปกติ ในกรณีส่วนใหญ่เชลล์ที่กำลังโต้ตอบจะเริ่มต้นเป็นเชลล์ล็อกอินและเชลล์หมายถึงการรันคำสั่งบางอย่างไม่ว่าจะเป็นอาร์กิวเมนต์หรือจากสคริปต์จากนั้น exit ก็เป็นเชลล์ปกติ
แต่มันขึ้นอยู่กับความต้องการของแอปพลิเคชั่นที่เริ่มต้นเชลล์