อะไรคือความแตกต่างในการทำงานระหว่าง.profile, .bash_profileและ.bashrcไฟล์?

answer

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

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

ไฟล์กำหนดค่าเชลล์ที่โดดเด่นอื่น ๆ :

/etc/bash_profile(fallback /etc/profile) จะถูกอ่านก่อนผู้ใช้.profileสำหรับการกำหนดค่าทั้งระบบ และ/etc/bashrcในทำนองเดียวกันในเชลล์ย่อย (ไม่มีทางเลือกสำรองสำหรับตัวเลือกนี้) หลายระบบรวมถึง Ubuntu ยังใช้/etc/profile.dไดเร็กทอรีที่มีเชลล์สคริปต์เล็ต ซึ่งได้แก่.( source)-ed จาก/etc/profile; แฟรกเมนต์ที่นี่เป็นแบบต่อเชลล์ โดย*.shใช้กับเชลล์ที่เข้ากันได้กับ Bourne/POSIX ทั้งหมด และส่วนขยายอื่นๆ ที่ใช้กับเชลล์นั้นโดยเฉพาะ

.ข้อมูลส่วนตัว

.profileมีไว้สำหรับสิ่งที่ไม่เกี่ยวข้องโดยเฉพาะBashเช่น ตัวแปรสภาพแวดล้อมPATHและเพื่อน และควรพร้อมใช้งานทุกเมื่อ

ตัวอย่างเช่น.profileควรโหลดเมื่อเริ่มเซสชันเดสก์ท็อปแบบกราฟิก


.bashrc

.bashrcใช้สำหรับกำหนดค่าการใช้งาน Bash แบบโต้ตอบเช่นBash aliasesการตั้งค่ารายการโปรดeditorการตั้งค่าBash promptฯลฯ


.bash_profile

.bash_profile มีไว้เพื่อให้แน่ใจว่าทั้งสองสิ่งใน.profileและ.bashrcถูกโหลดสำหรับlogin shells.

เช่น.bash_profileอาจเป็นอะไรง่ายๆ เช่น

. ~/.profile
. ~/.bashrc

หากคุณกำลังจะงด.bashrcเท่านั้น.profileจะได้รับการโหลด

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

ดังนั้นล็อกอินหรือไม่ล็อกอินเชลล์คืออะไร?

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

ข้อยกเว้นสำหรับหลักเกณฑ์ของหน้าต่างเทอร์มินัลคือ Terminal.app ของ Mac OS X ซึ่งเรียกใช้เชลล์การเข้าสู่ระบบตามค่าเริ่มต้นสำหรับหน้าต่างเทอร์มินัลใหม่แต่ละหน้าต่าง เรียก.bash_profileแทน.bashrc. เทอร์มินัลอีมูเลเตอร์ GUI อื่นๆ อาจทำเช่นเดียวกัน แต่ส่วนใหญ่มักจะไม่ทำ

เพิ่มเติมได้ที่: .bash_profile VS .bashrc - โดย Josh Staiger

ฉันใช้ man page สำหรับคำตอบนี้ ( man bash)

ไฟล์ทั้งสามถูกใช้โดย bash ในสถานการณ์ต่างๆ

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

สถานการณ์ที่ 2 : การไม่เข้าสู่ระบบแบบโต้ตอบ (นี่คือเชลล์ที่เริ่มต้นหลังจากล็อกอินเชลล์ครั้งแรก เชลล์นี้เป็นเชลล์ที่อนุญาตให้ผู้ใช้ป้อนข้อมูล) เมื่อเชลล์ที่ไม่ใช่การเข้าสู่ระบบแบบโต้ตอบเริ่มต้นขึ้น: Bash เพิ่งอ่าน /etc/bash.bashrc และ ~/.bashrc

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

นี่คือที่มาของฉัน

จากbash(1) - Linux man page