ฉันเปิดเทอร์มินัลบน 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
นอกจากนี้ยังได้รับการสนับสนุนซึ่งในกรณีส่วนใหญ่เพียงแค่ล้างหน้าจอและวิ่ง~/.logout
fortune
เชลล์อื่น ๆ ใช้คุณสมบัติเดียวกันนี้ ksh
จะอ่านใน~/.kshrc
, bash
จะอ่าน~/.bashrc
และผู้ที่ถูกที่คุณต้องการวางคำจำกัดความนามแฝงของคุณ
ดังนั้นเพื่อให้เรื่องราวสั้น ๆ แอปพลิเคชั่นที่วางไข่เชลล์จะตัดสินใจว่าควรจะเป็น "ล็อกอินเชลล์" หรือไม่ในกรณีนี้จะมี'-'
จุดเริ่มต้นหรือเชลล์ปกติ ในกรณีส่วนใหญ่เชลล์ที่กำลังโต้ตอบจะเริ่มต้นเป็นเชลล์ล็อกอินและเชลล์หมายถึงการรันคำสั่งบางอย่างไม่ว่าจะเป็นอาร์กิวเมนต์หรือจากสคริปต์จากนั้น exit ก็เป็นเชลล์ปกติ
แต่มันขึ้นอยู่กับความต้องการของแอปพลิเคชั่นที่เริ่มต้นเชลล์