ความแตกต่างระหว่าง. bashrc และ. bash_profile


450

อะไรคือความแตกต่างระหว่าง.bashrcและ.bash_profileกับสิ่งที่ฉันควรใช้


2
ดูคำถามที่คล้ายกันนี้ได้ที่ubuntu.stackexchange.com/questions/1528/bashrc-or-bash-profile
Stefan Lasiewski

หากคุณต้องการคำอธิบายที่สมบูรณ์ยิ่งขึ้น.profileให้ดูที่คำถามนี้: superuser.com/questions/789448/…
Flimm

คำตอบนี้ครอบคลุมบางแง่มุมstackoverflow.com/questions/415403/…
Sergey Voronezhskiy

คำตอบ:


518

ตามเนื้อผ้าเมื่อคุณเข้าสู่ระบบ Unix ระบบจะเริ่มโปรแกรมหนึ่งสำหรับคุณ โปรแกรมนั้นคือเชลล์คือโปรแกรมที่ออกแบบมาเพื่อเริ่มโปรแกรมอื่น มันเป็นเชลล์บรรทัดคำสั่ง: คุณเริ่มต้นโปรแกรมอื่นโดยพิมพ์ชื่อ เชลล์เริ่มต้นคือเชลล์เป้าหมายจะอ่านคำสั่งจาก~/.profileเมื่อมีการเรียกใช้เป็นเชลล์ล็อกอิน

Bash เป็นเปลือกหอยแบบบอร์น มันอ่านคำสั่งจาก~/.bash_profileเมื่อมันถูกเรียกเป็นเปลือกเข้าสู่ระบบและหากไฟล์นั้นไม่มีอยู่¹ก็ลองอ่าน~/.profileแทน

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

ดังนั้น:

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

  • ~/.bashrcเป็นสถานที่สำหรับวางสิ่งต่าง ๆ ที่ใช้กับการทุบตีเท่านั้นเช่นนามแฝงและคำจำกัดความของฟังก์ชั่นตัวเลือกเชลล์และการตั้งค่าที่รวดเร็ว (คุณสามารถใส่การเชื่อมโยงที่สำคัญได้ที่นั่น~/.inputrcด้วย

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

    if [ -r ~/.profile ]; then . ~/.profile; fi
    case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
    

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

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

¹ เพื่อความสมบูรณ์ตามคำขอ: ถ้า.bash_profileไม่ได้อยู่ทุบตียังพยายามก่อนที่จะล้มกลับไป.bash_login .profileอย่าลังเลที่จะลืมมันมีอยู่


11
+1 สำหรับโพสต์ที่ดี นอกจากนี้ขอขอบคุณที่เพิ่มหัวข้อเกี่ยวกับ "การเข้าสู่ระบบแบบกราฟิกกับการเข้าสู่ระบบเชลล์" ... ฉันมีปัญหาที่ฉันคิดว่า ~ / .profile จะดำเนินการแบบกราฟิก / เปลือกเสมอ ... แต่มันไม่ทำงานเมื่อผู้ใช้เข้าสู่ระบบ ผ่านการเข้าสู่ระบบแบบกราฟิก ขอบคุณสำหรับการไขปริศนานั้น
เทรเวอร์บอยด์สมิ ธ

4
@Gilles: คุณช่วยอธิบายรายละเอียดได้มากขึ้นด้วยตัวอย่างว่าทำไมการใช้เชลล์การเข้าสู่ระบบในทุกเทอร์มินัลจึงเป็นความคิดที่ไม่ดี? นี่เป็นเพียงปัญหาของเดสก์ท็อป Linux หรือไม่ (ฉันรวบรวมว่าใน OS X Terminal รันเชลล์การเข้าสู่ระบบทุกครั้งและฉันไม่เคยสังเกตเห็นผลข้างเคียงใด ๆ (แม้ว่าฉันมักจะใช้ iTerm) แต่แล้วฉันก็ไม่สามารถนึกถึงตัวแปรสภาพแวดล้อมมากมายที่ฉันสนใจนอก เทอร์มินัล (อาจเป็น HTTP_PROXY?))
iconoclast

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

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

3
@Gilles แน่นอน แต่วิธีการกำหนดประโยคในคำตอบแสดงให้เห็นว่าจำเป็นต้องรวม~/.bashrcมีบางอย่างที่เกี่ยวข้องกับการเลือก~/.bash_profileแทน~/.profileซึ่งไม่เป็นความจริง หากมีบางคนรวม~/.bashrcอยู่ในสคริปต์ชนิดใดก็ตามที่มีแหล่งที่มาในเวลาเข้าสู่ระบบ (ที่นี่เป็นอย่างใดอย่างหนึ่ง~/.bash_profileหรือ~/.profile) เป็นเพราะเขาต้องการให้การตั้งค่าจาก~/.bashrcที่จะนำไปใช้กับเปลือกเข้าสู่ระบบในลักษณะเดียวกัน
Piotr Dobrogost

53

จากบทความสั้น ๆ นี้

ตามหน้า bash man, .bash_profile จะถูกเรียกใช้งานสำหรับล็อกอินเชลล์ในขณะที่. bashrc ถูกเรียกใช้งานสำหรับเชลล์ที่ไม่ใช่ล็อกอินแบบโต้ตอบ

เชลล์สำหรับล็อกอินหรือที่ไม่ใช่ล็อกอินคืออะไร?

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

แต่ถ้าคุณได้ลงชื่อเข้าใช้เครื่องของคุณแล้วและเปิดหน้าต่างเทอร์มินัลใหม่ (xterm) ภายใน Gnome หรือ KDE ระบบจะดำเนินการ. bashrc ก่อนที่จะพร้อมรับคำสั่งของหน้าต่าง .bashrc ยังทำงานเมื่อคุณเริ่มอินสแตนซ์ bash ใหม่โดยพิมพ์ / bin / bash ในเทอร์มินัล


12
การอัปเดตเล็กน้อย: 'ดำเนินการแล้ว' อาจเป็นคำที่ทำให้เข้าใจผิดเล็กน้อยพวกเขาทั้งคู่มีที่มา ดำเนินการแล้วดูเหมือนจะเป็นสคริปต์, fork / exec yadda yadda มันทำงานในบริบทของเชลล์ปัจจุบันที่สำคัญกว่านั้นคือ. bashrc ทำงานบ่อยกว่ามาก มันทำงานในทุก ๆ bash script และถ้าคุณไม่มี. bash_profile นอกจากนี้ขึ้นอยู่กับว่าคุณตั้งค่า xterms ของคุณอย่างไรคุณอาจสร้างเชลล์ที่แหล่งที่มา. bash_profile
Rich Homolka

36

ย้อนกลับไปในสมัยก่อนเมื่อ pseudo tty ไม่ได้ถูกหลอกและที่จริงแล้วพิมพ์ดีดและ UNIX ถูกเข้าถึงโดยโมเด็มดังนั้นช้าคุณจะเห็นตัวอักษรแต่ละตัวถูกพิมพ์ลงบนหน้าจอของคุณประสิทธิภาพนั้นสำคัญยิ่ง เพื่อช่วยให้มีประสิทธิภาพค่อนข้างคุณมีแนวคิดของหน้าต่างเข้าสู่ระบบหลักและหน้าต่างอื่น ๆ ที่คุณเคยใช้งานจริง ในหน้าต่างหลักของคุณคุณต้องการรับการแจ้งเตือนไปยังจดหมายใหม่ใด ๆ อาจเรียกใช้โปรแกรมอื่น ๆ ในพื้นหลัง

เพื่อสนับสนุนสิ่งนี้เชลล์ได้จัดหาไฟล์.profileไว้ที่ 'login shells' โดยเฉพาะ นี้จะทำพิเศษเมื่อตั้งค่าเซสชั่น Bash ขยายสิ่งนี้ให้ดูที่. bash_profile ก่อนหน้านี้. profile, ด้วยวิธีนี้คุณสามารถใส่ bash ได้เฉพาะสิ่งที่อยู่ในนั้น เชลล์อื่นที่ไม่ใช่การเข้าสู่ระบบจะเป็นแหล่งไฟล์ rc, .bashrc (หรือ. kshrc เป็นต้น)

นี่เป็นความผิดปกติเล็กน้อยในตอนนี้ คุณไม่ได้เข้าสู่เชลล์หลักเท่าที่คุณเข้าสู่ระบบจัดการหน้าต่าง gui ไม่มีหน้าต่างหลักที่แตกต่างจากหน้าต่างอื่น ๆ

ข้อเสนอแนะของฉัน - ไม่ต้องกังวลกับความแตกต่างนี้มันขึ้นอยู่กับรูปแบบเก่าของการใช้ยูนิกซ์ กำจัดความแตกต่างในไฟล์ของคุณ เนื้อหาทั้งหมดของ. bash_profile ควรเป็น:

[ -f $HOME/.bashrc ] && . $HOME/.bashrc

และใส่ทุกอย่างที่คุณต้องการตั้งเป็น. bashrc

โปรดจำไว้ว่า. bashrc นั้นมีแหล่งที่มาสำหรับเชลล์ทั้งหมดแบบโต้ตอบและแบบไม่โต้ตอบ คุณสามารถลัดวงจรการจัดหาสำหรับเชลล์ที่ไม่มีการโต้ตอบได้โดยวางโค้ดนี้ใกล้กับส่วนบนของ. bashrc:

[[ $- != *i* ]] && return


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

4
@Gilles ฉันไม่เข้าใจว่าทำไมคุณถึงอ้างสิทธิ์นี้ ด้วย.$HOME/.bashrcที่อุดมไปด้วยแสดงให้เห็นข้างต้นการตั้งค่าใน.bashrcจะสามารถใช้ได้ในเปลือกเข้าสู่ระบบและทำให้สภาพแวดล้อมเดสก์ทอปเช่นกัน ตัวอย่างเช่นในระบบ Fedora ของฉันgnome-sessionเริ่มต้น-$SHELL -c gnome-sessionด้วยการ.profileอ่าน
Mikel

2
@PiotrDobrogost โอ้ใช่มีปัญหาอีกคำตอบของ Rich การรวม.bashrcใน.profileโดยทั่วไปจะไม่ทำงานเพราะ.profileอาจถูกดำเนินการโดย/bin/shและไม่ทุบตี (เช่นใน Ubuntu สำหรับการเข้าสู่ระบบแบบกราฟิกโดยค่าเริ่มต้น) และเชลล์นั้นอาจไม่สามารถทำงานแบบโต้ตอบได้ (เช่นสำหรับการเข้าสู่ระบบแบบกราฟิก)
Gilles

3
@Gilles อีกครั้ง: "รวมถึง. bashrc ใน. profile" ไม่ได้เป็นสิ่งที่แนะนำ (ค่อนข้างตรงกันข้ามในความเป็นจริง) อาจมีการแก้ไขคำตอบ (ไม่ปรากฏขึ้น) หรือความคิดเห็นของคุณไม่สอดคล้องกับสิ่งที่พูด
ไมเคิล

2
โดยทั่วไป +1 แต่ฉันจะเพิ่มคำแนะนำในการ "ลัดวงจร ... สำหรับกระสุนที่ไม่มีการโต้ตอบ" ("ใกล้กับด้านบนของ. bashrc: [[ $- != *i* ]] && return"); ฉันต้องการให้บางส่วนของฉัน.bashrcถูกเรียกใช้แม้สำหรับเชลล์ที่ไม่มีการโต้ตอบโดยเฉพาะเพื่อตั้งค่า env vars เมื่อออกssh hostname {command}เพื่อให้คำสั่งรีโมตเรียกใช้งานได้อย่างถูกต้อง (แม้ว่าเชลล์ไม่ใช่แบบโต้ตอบ) แต่.bashrcควรละเว้นการตั้งค่าอื่น ๆ ในภายหลัง ฉันมักจะตรวจสอบ TERM = เป็นใบ้และ / หรือยกเลิกการตั้งค่าและประกันตัวออกมาก่อน
ไมเคิล

18

มีลักษณะที่นี้โพสต์บล็อกที่ยอดเยี่ยมโดย ShreevatsaR นี่คือสารสกัด แต่ไปที่โพสต์บล็อกซึ่งมีคำอธิบายสำหรับคำเช่น "เชลล์ล็อกอิน" แผนภูมิการไหลและตารางที่คล้ายกันสำหรับ Zsh

สำหรับ Bash พวกเขาทำงานดังนี้ อ่านคอลัมน์ที่เหมาะสม ดำเนินการ A จากนั้น B จากนั้น C และอื่น ๆ B1, B2, B3 หมายถึงดำเนินการเฉพาะไฟล์แรกที่พบ

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+

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

1
@Mokubai คำถามอื่นได้ถูกทำเครื่องหมายว่าซ้ำกับคำถามนี้
Flimm

@ElipticalView: โดยชุดที่จะทำอะไรที่คุณหมายถึงบรรทัด: [ -z "$PS1" ] && return? ตารางในคำตอบของฉันคือให้รายการของสคริปต์ที่ดำเนินการโดย Bash โดยไม่คำนึงถึงเนื้อหาของสคริปต์หากสคริปต์มีบรรทัด[ -z "$PS1" ] && returnแน่นอนว่าจะมีผล แต่ฉันไม่คิดว่าควรจะเปลี่ยน โต๊ะ.
Flimm

5

ความคิดเห็นที่ดีกว่าสำหรับส่วนหัว / ETC / โปรไฟล์

เมื่อสร้างคำตอบที่ดีเยี่ยมของ Flimm ข้างบนฉันได้ยืนยันความคิดเห็นใหม่นี้ที่ส่วนหัวของ Debian / etc / profile ของฉัน(คุณอาจต้องปรับเปลี่ยนสำหรับ distro ของคุณ) :

# For BASH: Read down the appropriate column. Executes A, then B, then C, etc.
# The B1, B2, B3 means it executes only the first of those files found.  (A)
# or (B2) means it is normally sourced by (read by and included in) the
# primary file, in this case A or B2.
#
# +---------------------------------+-------+-----+------------+
# |                                 | Interactive | non-Inter. |
# +---------------------------------+-------+-----+------------+
# |                                 | login |    non-login     |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   ALL USERS:                    |       |     |            |
# +---------------------------------+-------+-----+------------+
# |BASH_ENV                         |       |     |     A      | not interactive or login
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile                     |   A   |     |            | set PATH & PS1, & call following:
# +---------------------------------+-------+-----+------------+
# |/etc/bash.bashrc                 |  (A)  |  A  |            | Better PS1 + command-not-found 
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/bash_completion.sh|  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/vte-2.91.sh       |  (A)  |     |            | Virt. Terminal Emulator
# |/etc/profile.d/vte.sh            |  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   A SPECIFIC USER:              |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_profile    (bash only)   |   B1  |     |            | (doesn't currently exist) 
# +---------------------------------+-------+-----+------------+
# |~/.bash_login      (bash only)   |   B2  |     |            | (didn't exist) **
# +---------------------------------+-------+-----+------------+
# |~/.profile         (all shells)  |   B3  |     |            | (doesn't currently exist)
# +---------------------------------+-------+-----+------------+
# |~/.bashrc          (bash only)   |  (B2) |  B  |            | colorizes bash: su=red, other_users=green
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_logout                   |    C  |     |            |
# +---------------------------------+-------+-----+------------+
#
# ** (sources !/.bashrc to colorize login, for when booting into non-gui)

และหมายเหตุนี้ที่ส่วนหัวของไฟล์การตั้งค่าอื่น ๆ เพื่ออ้างอิง:

# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE

น่าสังเกตว่าฉันคิดว่าเป็น / etc / โปรไฟล์ของ Debian ตามแหล่งเริ่มต้น (รวมถึง) /etc/bash.bashrc (นั่นคือเมื่อ /etc/bash.bashrc มีอยู่) ดังนั้นสคริปต์การเข้าสู่ระบบจะอ่านทั้งไฟล์ / etc ในขณะที่ผู้ที่ไม่ได้ลงชื่อเข้าใช้จะอ่านเฉพาะ bash.bashrc

สิ่งที่ควรทราบอีกอย่างคือ /etc/bash.bashrc ถูกตั้งค่าเป็นไม่ทำอะไรเลยเมื่อมันไม่ทำงานแบบโต้ตอบ ดังนั้นทั้งสองไฟล์นี้มีไว้สำหรับสคริปต์แบบโต้ตอบเท่านั้น


4

ตรรกะการกำหนดค่าของ bash นั้นไม่ซับซ้อนและอธิบายในคำตอบอื่น ๆ ในหน้านี้ใน serverfault และในหลาย ๆ บล็อก อย่างไรก็ตามปัญหาคือสิ่งที่ดิสทริบิวชั่นลีนุกซ์ของทุบตี , ฉันหมายถึงความซับซ้อนและวิธีการต่าง ๆ ที่พวกเขากำหนดค่าทุบตีโดยค่าเริ่มต้น. http://mywiki.wooledge.org/DotFilesกล่าวถึงนิสัยใจคอเหล่านี้สั้น ๆ นี่คือตัวอย่างหนึ่งของการติดตามใน Fedora 29 ซึ่งจะแสดงแหล่งที่มาของไฟล์ที่ไฟล์อื่น ๆ และลำดับสำหรับสถานการณ์ที่ง่ายมาก: เชื่อมต่อกับ ssh จากระยะไกลแล้วเริ่ม subshell อื่น:

ssh fedora29
 └─ -bash # login shell
      ├── /etc/profile
      |    ├─ /etc/profile.d/*.sh
      |    ├─ /etc/profile.d/sh.local
      |    └─ /etc/bashrc
      ├── ~/.bash_profile
      |    └─ ~/.bashrc
      |          └─ /etc/bashrc
      |
      |
      └─ $ bash  # non-login shell
            └─ ~/.bashrc
                 └─ /etc/bashrc
                       └─ /etc/profile.d/*.sh

ตรรกะที่ซับซ้อนที่สุดของ Fedora คือ/etc/bashrcอะไร ดังที่เห็นด้านบน/etc/bashrcคือไฟล์ทุบตีตัวเองไม่รู้เกี่ยวกับฉันหมายถึงไม่ได้โดยตรง /etc/bashrcการทดสอบของ Fedora ไม่ว่าจะเป็น:

  • มันถูกแหล่งที่มาจากเปลือกเข้าสู่ระบบ
  • มันถูกแหล่งที่มาจากเปลือกโต้ตอบ
  • มันได้รับมาแล้ว

... และจากนั้นทำสิ่งที่แตกต่างอย่างสิ้นเชิงขึ้นอยู่กับสิ่งเหล่านั้น

หากคุณคิดว่าสามารถจำกราฟด้านบนได้ก็ถือว่าแย่เกินไปเพราะมันยังไม่พอ: กราฟนี้อธิบายเพียงสถานการณ์เดียวสิ่งต่าง ๆ เกิดขึ้นเล็กน้อยเมื่อรันสคริปต์ที่ไม่ต้องมีการโต้ตอบหรือเริ่มเซสชันกราฟิก ฉันข้าม~/.profileไปแล้ว ฉันไม่ได้bash_completionใช้สคริปต์ สำหรับเหตุผลด้านความเข้ากันได้แบบย้อนหลังให้เรียกใช้ bash /bin/shแทน/bin/bashการเปลี่ยนพฤติกรรม แล้ว zsh และ shell อื่น ๆ ล่ะ? และแน่นอนว่าการแจกแจงที่แตกต่างกันของ Linux ทำสิ่งที่แตกต่างกันเช่นDebian และ Ubuntu มาพร้อมกับ bas h รุ่นที่ไม่ได้มาตรฐานแต่ก็มีการปรับแต่งเฉพาะ Debian มันจะมองหาไฟล์ที่ผิดปกติ:/etc/bash.bashrc. แม้ว่าคุณจะยึดติดกับลินุกซ์ตัวเดียวมันก็อาจพัฒนาไปตามกาลเวลา รอสักครู่: เรายังไม่ได้สัมผัส macOS, FreeBSD, ... ในที่สุดเรามีความคิดสำหรับผู้ใช้ที่ติดอยู่กับวิธีที่สร้างสรรค์ยิ่งกว่าเดิมที่ผู้ดูแลระบบกำหนดค่าระบบที่พวกเขาต้องใช้

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

เพื่อความสนุกที่สุดท้ายนี่คือ "กราฟแหล่งที่มา" สำหรับสถานการณ์แบบง่าย ๆ บน Clear Linux เมื่อวันที่ 25 มิถุนายน 2562:

ssh clearlinux
 └─ -bash # login shell
      ├── /usr/share/defaults/etc/profile
      |    ├─ /usr/share/defaults/etc/profile.d/*
      |    ├─ /etc/profile.d/*
      |    └─ /etc/profile
      ├── ~/.bash_profile
      |
      |
      └─  $ bash   # non-login shell
           ├─ /usr/share/defaults/etc/bash.bashrc
           |      ├─ /usr/share/defaults/etc/profile
           |      |    ├─ /usr/share/defaults/etc/profile.d/*
           |      |    ├─ /etc/profile.d/*
           |      |    └─ /etc/profile
           |      └─ /etc/profile
           └─ ~/.bashrc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.