ลำดับของสคริปต์ที่มาเมื่อเข้าสู่ระบบ


41

~/.bash_profileผมอยากที่จะมีสมาธิทั้งหมดเข้าสู่ระบบการตั้งค่าของฉัน มี~/.bashrcโดยมีค่าเริ่มต้น ~/.bash_profileแต่ฉันแทนที่มันด้วย

อย่างไรก็ตามเมื่อฉันเข้าสู่ระบบบางสิ่งก่อนที่ฉัน~/.bash_profileจะได้รับที่มาและแสดงต่อไปนี้:

Linux ubnt10-dev1 2.6.32-38-server #83-Ubuntu SMP Wed Jan 4 11:26:59 UTC 2012 x86_64 GNU/Linux
Ubuntu 10.04.4 LTS

Welcome to the Ubuntu Server!
 * Documentation:  http://www.ubuntu.com/server/doc

  System information as of Fri May  9 12:17:39 EDT 2014

  System load:  0.01              Processes:           74
  Usage of /:   5.5% of 18.58GB   Users logged in:     0
  Memory usage: 4%                IP address for eth0: 123.x.x.x
  Swap usage:   0%

  Graph this data and manage this system at https://landscape.canonical.com/

New release 'precise' available.
Run 'do-release-upgrade' to upgrade to it.

Last login: Fri May  9 12:11:52 2014 from 123.x.x.x

ฉันต้องการลบออกเพื่อให้เฉพาะคำทักทายสแปลชของฉันที่กำหนดในหน้า~/.bash_profileจอแสดงผลของฉัน แต่ฉันไม่แน่ใจเกี่ยวกับตรรกะ / ลำดับของสคริปต์ที่มา / ดำเนินการเมื่อผู้ใช้ลงชื่อเข้าใช้คุณสามารถสอนฉันได้หรือไม่

ในฐานะโบนัสฉันต้องการทราบลำดับของ sourcings / execs อัตโนมัติเมื่อระบบเริ่มทำงานไม่ใช่แค่เมื่อผู้ใช้เริ่มเซสชันโดยการล็อกอิน แต่นี่เป็นเรื่องที่ฉันกังวลน้อยลงในตอนนี้

คำตอบ:


53

มันซับซ้อนนะ ก่อนอื่นรายละเอียดขึ้นอยู่กับชนิดของเชลล์ที่คุณใช้ เพื่อขโมยความคิดของตัวเอง :

  • เมื่อคุณเปิดเทอร์มินัลอีมูเลเตอร์ ( gnome-terminalตัวอย่าง) คุณกำลังดำเนินการสิ่งที่เรียกว่าเชลล์แบบโต้ตอบและไม่ใช่การล็อกอิน

  • เมื่อคุณล็อกอินเข้าสู่เครื่องจากบรรทัดคำสั่งหรือเรียกใช้คำสั่งเช่นsu - usernameคุณกำลังเรียกใช้เชลล์ล็อกอินแบบโต้ตอบ

  • เมื่อคุณเข้าสู่ระบบแบบกราฟิกคุณกำลังเรียกใช้บางสิ่งที่แตกต่างอย่างสิ้นเชิง รายละเอียดจะขึ้นอยู่กับระบบและสภาพแวดล้อมแบบกราฟิกของคุณ แต่โดยทั่วไปจะเป็นเชลล์แบบกราฟิกที่เกี่ยวข้องกับการเข้าสู่ระบบของคุณ ในขณะที่เชลล์กราฟิกจำนวนมาก (รวมถึงค่าเริ่มต้นของ Ubuntu) จะอ่าน/etc/profileและ~/.profileไม่สามารถทำได้ทั้งหมด

  • ในที่สุดเมื่อคุณเรียกใช้สคริปต์เปลือกก็จะทำงานในไม่โต้ตอบเปลือกที่ไม่ได้เข้าสู่ระบบ

ไฟล์ที่ทุบตีจะอ่านเมื่อเปิดตัวขึ้นอยู่กับประเภทของเปลือกที่กำลังทำงานเป็น ต่อไปนี้เป็นข้อความที่ตัดตอนมาจากส่วน INVOCATION ของman bash(เหมืองของการเน้น):

เมื่อทุบตีถูกเรียกเป็นเปลือกเข้าสู่ระบบแบบโต้ตอบหรือเป็นเปลือกไม่โต้ตอบกับตัวเลือก --login มันเป็นครั้งแรกอ่านและรันคำสั่งจากแฟ้ม/ etc / profileถ้าไฟล์ที่มีอยู่ หลังจากอ่านไฟล์นั้นจะค้นหา~ / .bash_profile, ~ / .bash_login และ ~ / .profile ตามลำดับและอ่านและเรียกใช้คำสั่งจากไฟล์แรกที่มีอยู่และอ่านได้ ตัวเลือก --noprofile อาจถูกใช้เมื่อเชลล์เริ่มต้นเพื่อยับยั้งพฤติกรรมนี้

เมื่อเชลล์เชิงโต้ตอบที่ไม่ใช่เชลล์ล็อกอิน เริ่มทำงาน bash จะอ่านและดำเนินการคำสั่งจาก/etc/bash.bashrcและ~ / .bashrcหากมีไฟล์เหล่านี้อยู่ สิ่งนี้อาจถูกยับยั้งโดยใช้ตัวเลือก --norc ตัวเลือกไฟล์ --rcfile จะบังคับให้ทุบตีเพื่ออ่านและดำเนินการคำสั่งจากไฟล์แทน /etc/bash.bashrc และ ~ / .bashrc

เหล่านี้เป็นไฟล์เริ่มต้น นอกจากนี้คุณยังมี/etc/environmentที่ที่คุณสามารถตั้งค่าตัวแปรสภาวะแวดล้อมโกลบอลได้ แต่เป็นการอ่านมากกว่าที่จะให้แหล่งที่มา (คำสั่งภายในนั้นไม่ได้ถูกเรียกใช้ แต่มีการตั้งค่านิยามตัวแปรไว้)

ตอนนี้คำทักทายที่คุณเห็นนั้นเป็นอย่างอื่นอีกครั้ง ที่ตั้งอยู่ในและจะปรากฏผ่าน/etc/motd pam_motdตามที่อธิบายไว้ในman motd:

เนื้อหาของ / etc / motd ถูกแสดงโดย pam_motd (8) หลังจากการล็อกอินสำเร็จ แต่ก่อนที่มันจะประมวลผลล็อกอินเชลล์

ตัวย่อ "motd" ย่อมาจาก "message of the day" และไฟล์นี้มีการใช้แบบดั้งเดิมตามที่ระบุไว้ (ต้องใช้พื้นที่ดิสก์น้อยกว่าเมล์ถึงผู้ใช้ทั้งหมด)

บน Debian GNU / Linux เนื้อหาของ /run/motd.dynamic ก็จะปรากฏขึ้นเช่นกัน ไฟล์นี้สร้างโดย /etc/init.d/motd ตอนบูท

หากต้องการลบข้อความให้ล้าง/etc/motdไฟล์และตรวจสอบให้แน่ใจว่าไม่มีสิ่งใดถูกสร้างขึ้นโดย/etc/init.d/motdถ้ามี


อย่างไรก็ตามดูเหมือนsshว่าคุณกำลังเข้าสู่ระบบผ่านทางเอาท์พุทที่คุณแสดงซึ่งหมายความว่าคุณกำลังใช้เปลือกเข้าสู่ระบบแบบโต้ตอบดูด้านบนสำหรับสิ่งที่หมายถึง ดังนั้นโดยสรุปสิ่งที่คุณสนใจนั้นมีที่มาเมื่อคุณเข้าสู่ระบบคือ (และตามลำดับนี้):

  1. ภูต SSH ผ่านpam_motdโมดูลห้องสมุด PAM /etc/motdที่แสดงเนื้อหาของ ผ่านpam_envโมดูลจะกำหนดตัวแปรสภาพแวดล้อมจากและ/etc/environment~/.pam_environment
  2. เชลล์ล็อกอินเริ่มทำงานและไฟล์ต่อไปนี้ถูกอ่านตามลำดับ:
    1. /etc/profile
    2. /etc/bash.bashrc( /etc/profileแหล่งUbuntu เริ่มต้น/etc/bash.bashrc)
    3. ~/.bash_profile. ไฟล์อื่น ๆ ที่สามารถอ่านได้ที่นี่ ( ~/.profileและ~/.bash_login) จะถูกละเว้นเพราะ~/.bash_profileมีอยู่

5
เคล็ดลับที่ดีในการค้นพบตัวเองสิ่งนี้คือการวางตัวแปรแมวมองไว้รอบ ๆ ฉันหมายความว่าฉันใส่export SET_IN_ETC_PROFILE=yesใน/etc/profile, export SET_IN_HOME_ZSHRC=yesใน~/.zhshrc(I am ผู้ใช้ zsh ก) ฯลฯ ... แล้วรีบูตและมีความสุขenv|grep SET_INที่จะบอกคุณทุกเรื่อง หากต้องการดูว่าแอปพลิเคชันเดสก์ท็อปใดบ้างที่เห็นตัวแปร (ตัวที่คุณเรียกใช้จากเส้นประหรือ WM โดยไม่ต้องใช้เทอร์มินัล) ให้ดูaskubuntu.com/a/356973/16395
Rmano

1
ดังนั้นเมื่อคุณ ssh นั่นจะเป็นเชลล์แบบโต้ตอบใช่ไหม?
สัตว์สะเทินน้ำสะเทินบก

@amphibient เชลล์ล็อกอินแบบโต้ตอบใช่ เมื่อคุณเปิดเทอร์มินัลด้วยเครื่องทัวร์ท้องถิ่นมันเป็นเชลล์แบบโต้ตอบและไม่ใช่การลงชื่อ
terdon

@Rmano ฉันยกระดับความคิดเห็นของคุณ แต่ครู่ต่อมาพบว่าคำสั่งenvไม่มีความสัมพันธ์กับลำดับของการดำเนินการ
Penghe Geng

2
@xiaobai ไม่แน่นอนประเด็นก็คือSET_INจะแสดงให้คุณเห็นว่าไฟล์ใดบ้างที่ถูกอ่านไม่ใช่ลำดับที่ถูกอ่าน การสั่งซื้อเป็นมาตรฐานมันเป็นสิ่งที่แสดงในหน้าข้อความที่ตัดตอนมาที่ฉันมีในคำตอบของฉัน
terdon

1

ข้อมูลที่คุณเห็นเมื่อคุณเข้าสู่ระบบผ่าน ssh ถูกสร้างขึ้นก่อน / etc / profile แม้กระทั่งเคยดู ดูลำดับของไฟล์ใน /etc/update-motd.d ที่จะแสดงให้คุณเห็นว่าข้อความที่คุณเห็นนั้นถูกสร้างขึ้นจากสคริปต์ต่างๆ


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