ทำไม 'echo $ 0' ให้ผลลัพธ์ที่ต่างกันสำหรับเทอร์มินัลสองเครื่องที่แตกต่างกัน


15

ฉันเปิดเทอร์มินัลบน Ubuntu โดยใช้Ctrl+ Alt+ Tและเทอร์มินัลอื่นโดยไปที่ไดเรกทอรีแล้วคลิกขวาและเลือก "เปิดในเทอร์มินัล"

ฉันทำecho $0ทั้งสองกรณี

ในกรณีแรก:

$ echo $0
-bash

ในกรณีที่สอง:

$ echo $0
/bin/bash

ทำไมความแตกต่างนี้


$ 0 ส่งคืนชื่อของกระบวนการทำงาน
Ramesh

คุณรันสองเทอร์มินัลด้วยผู้ใช้อื่นหรือไม่?
cuonglm

ฉันใช้ผู้ใช้เดียวกัน
CodeBlue

3
คำถามที่คล้ายกันaskubuntu.com/questions/368509/why-is-0-set-to-bash
Avinash Raj

พวกมันต่างกันที่เทอร์มินัลอีมูเลเตอร์หรือเป็นเพียงสองอินสแตนซ์ของเทอร์มินัลอีมูเลเตอร์เดียวกันหรือไม่? พวกเขาทั้งสองสถานีเริ่มต้นหรือไม่
terdon

คำตอบ:


16

หากเอาต์พุตของ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 เดียวกันตลอดเวลา):

ป้อนคำอธิบายรูปภาพที่นี่


12

ความแตกต่างอยู่ที่วิธีการเริ่มต้นเหล่านี้ ทุบตีจะเริ่มต้นแตกต่างกัน (อ่านสคริปต์เริ่มต้นที่แตกต่างกัน) ขึ้นอยู่กับมัน argv [0] หากสตริงเริ่มต้นด้วยเครื่องหมายยัติภังค์-เหมือนใน-bashนั้นมันจะทำงานเป็นเปลือกเข้าสู่ระบบถ้าไม่มันจะทำงานเป็นเปลือกโต้ตอบ นอกจากนี้ยังสามารถเรียกใช้เป็นเชลล์แบบไม่มีการโต้ตอบ (เช่นในเชลล์สคริปต์)

หากต้องการข้อมูลเพิ่มเติมควรอ่านคู่มือman bashส่วน INVOCATION


9

เปลือกจะเริ่มต้นเมื่อคุณเข้าสู่ระบบ แต่ก็ยังตั้งขึ้นโดยโปรแกรมเช่น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 ก็เป็นเชลล์ปกติ

แต่มันขึ้นอยู่กับความต้องการของแอปพลิเคชั่นที่เริ่มต้นเชลล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.