ได้มีการกล่าวว่าการตั้งค่าสำหรับเปลือกไม่ใช่เพื่อเข้า.bashrc
สู่การตั้งค่าไฟล์และเข้าสู่ระบบเปลือกเพื่อเข้าสู่.profile
ไฟล์
เชลล์ล็อกอินและเชลล์ที่ไม่ใช่การล็อกอินมีความหมายอย่างไร
โปรดอธิบายโดยไม่ใช้ศัพท์แสงทางเทคนิคเท่าที่จะทำได้
ได้มีการกล่าวว่าการตั้งค่าสำหรับเปลือกไม่ใช่เพื่อเข้า.bashrc
สู่การตั้งค่าไฟล์และเข้าสู่ระบบเปลือกเพื่อเข้าสู่.profile
ไฟล์
เชลล์ล็อกอินและเชลล์ที่ไม่ใช่การล็อกอินมีความหมายอย่างไร
โปรดอธิบายโดยไม่ใช้ศัพท์แสงทางเทคนิคเท่าที่จะทำได้
คำตอบ:
หากคุณเป็นผู้ใช้งานปกติของ Ubuntu Desktop เพียงแค่ล็อกอินเชลล์คือ ... เดสก์ท็อปของคุณ (คุณพิมพ์รหัสผ่านเพื่อเข้าใช้ใช่ไหม)? ในทางเทคนิคแล้วมันคือเชลล์การล็อกอินที่เริ่ม GUI แต่มันเข้าสู่ศัพท์แสง และใช่มันจะอ่านการตั้งค่าใน.profile
ในครั้งเดียวที่คุณ (ผู้ใช้ปกติ) อาจจะเห็นเชลล์ล็อกอินที่ดูเหมือนเชลล์ล็อกอินคือถ้าคุณมีปัญหากับเดสก์ท็อปของคุณและคุณเปลี่ยนไปใช้เทอร์มินัลเสมือนด้วยCtrl+ Alt+ F1ทางลัด
ssh
(หรือเชื่อมต่อภายในกับssh localhost
)bash -l
(หรือsh -l
)root
เชลล์ล็อกอินเริ่มต้นด้วยsudo -i
sudo -u username -i
root
root
ผู้ใช้ที่มี(และพวกเขารหัสผ่าน)su - username
sudo login
คำสั่งเพื่อสลับผู้ใช้~/.pam_environment
(ตัวแปรเท่านั้นไม่มีคำสั่ง bash ในนั้น!) ออกจากระบบเข้าสู่ระบบและดูทุกสิ่งที่ปรากฏอย่างน่าอัศจรรย์ในเดสก์ท็อปเช่นเดียวกับใน gnome-terminal!
/etc/profile
, หรือ/etc/profile.d
~/.profile
ฉันไม่คิดว่าคำตอบที่ถูกต้องสามารถให้ได้โดยไม่ต้อง "ศัพท์แสงทางเทคนิค" เนื่องจากคำถามนี้เป็นคำถามแรกที่โผล่ขึ้นมาใน Google สำหรับข้อความค้นหา "เปลือกหอยเข้าสู่ระบบ" คืออะไรฉันจึงให้คำตอบที่ถูกต้องมากขึ้นด้านล่าง:
ล็อกอินเชลล์เป็นเพียงเชลล์ที่บอกว่าเป็นเชลล์ล็อกอิน มันไม่ได้หมายความว่าเชลล์ที่ปรากฏขึ้นหลังจากที่คุณเข้าสู่ระบบ แต่โดยทั่วไปแล้วแอปพลิเคชันที่ลงชื่อเข้าใช้ของคุณจะบอกว่ามันเปิดตัวเป็นเชลล์สำหรับเข้าสู่ระบบ มีวิธีต่อไปนี้ในการบอกเชลล์ว่าควรเป็นชื่อล็อกอิน:
-l
หรือ--login
อาร์กิวเมนต์สมมติว่ามันรู้ (ฉันไม่รู้เชลล์ใด ๆ ที่ไม่ทราบ-l
แต่--login
มีเชลล์เพียงไม่กี่ตัวที่รองรับ)argv[0]
ตั้งค่าเป็น-{some_string}
(เช่นกับ HYPHEN-MINUS prepended เป็นปกติargv[0]
หรือกับสตริงอื่น ๆ ) นี่คือสิ่งที่ ssh และ su ทำ: su เพียงเรียกใช้ปฏิบัติการด้วย-su
เป็นargv[0]
(สวัสดีทุกคนคิดว่าargv[0]
มีบางอย่างที่เกี่ยวข้องกับชื่อเรียกใช้งานได้ในปัจจุบัน), ssh รัน zsh ด้วย-zsh
เมื่อผู้ใช้ตั้งค่า/bin/zsh
เป็นเชลล์ของเขาความเป็นกันเองของเชลล์ไม่มีอะไรเกี่ยวข้องกับใครเลยที่ขอรหัสผ่านหรือดำเนินการตามขั้นตอนการตรวจสอบอัตโนมัติอื่น ๆ บางโปรแกรมเช่น ssh หรือล็อกอิน (หรือเทอร์มินัลอีมูเลเตอร์เช่น urxvt) เรียกใช้เชลล์เป็นโปรแกรมเข้าสู่ระบบโดยใช้argv[0]
ที่เริ่มต้นด้วย HYPHEN-MINUS บางอย่างเช่น su หรือ sudo (หรือ zsh: ดู-
ตัวแก้ไขคำสั่งล่วงหน้าที่อธิบายไว้ในส่วน PRECOMMAND MODIFIERS ในman zshmisc
) ไม่ได้ทำตามค่าเริ่มต้น แต่สามารถบอกได้ บางคนมีตัวเลือกเดียวในการบอกเชลล์ให้เข้าสู่ระบบโดยใช้อาร์กิวเมนต์ (เช่นbash -l
): ssh พร้อมอาร์กิวเมนต์คำสั่ง (ที่แจ้งให้ ssh ทราบว่าจะรันบนรีโมตปลายทางอย่างชัดเจน)
โดยทั่วไปจะดีกว่าที่จะปรึกษาก่อนเอกสารของโปรแกรมที่ใช้ในการเรียกเปลือกเพื่อตรวจสอบว่าเปลือกจะเป็นหนึ่งในการเข้าสู่ระบบและครั้งที่สองดำเนินการทดสอบบางอย่างเพื่อตรวจสอบว่าแอปจะเปิดตัวเปลือกเข้าสู่ระบบ (เช่นโดยการเพิ่มecho
การ.profile
)
argv[0]
ไปยังหนึ่งในexec*
ฟังก์ชั่นธรรมชาติและหลีกเลี่ยงไม่ได้: คุณมักจะจัดหาทั้งสอง argv[0]
และเส้นทางไปยังคำสั่งที่ใช้จริงเมื่อใช้exec*
ฟังก์ชั่นแม้ว่าคุณไม่ต้องการargv[0]
ที่จะแตกต่างจากคำสั่งเรียกใช้ ภาษาอื่นให้วิธีการของตนเอง โดยเฉพาะทุบตีอนุญาตให้ใช้exec -a new_argv0 bash
แต่ของหลักสูตรที่จะเข้ามาแทนที่กำลังทำงานเปลือกกับสิ่งที่คุณexec
ed ดังนั้นคุณอาจต้องใช้ subshell ( (exec -a -zsh zsh)
)
$0
และบางทีอาจเป็นอย่างอื่น (ตัวแปรการตั้งค่าและอื่น ๆ ) ได้รับการตั้งค่าเพื่อให้ความสามารถในการตรวจพบเชลล์ในไฟล์กำหนดค่า แต่ใครที่รบกวนการตรวจจับนี้จริง ๆ แล้วมันจะสร้างความแตกต่าง? นั่นคือทั้งหมดที่ฉันรู้.