อะไรคือความแตกต่างระหว่าง. bashrc, .bash_profile และ. environment?


130

ฉันใช้ระบบที่ใช้ * nix ที่แตกต่างกันหลายปีและดูเหมือนว่าทุกรสชาติของ Bash ที่ฉันใช้จะมีอัลกอริทึมที่แตกต่างกันในการตัดสินใจว่าจะเรียกใช้สคริปต์เริ่มต้นใด สำหรับวัตถุประสงค์ของงานต่างๆเช่นการตั้งค่าตัวแปรสภาพแวดล้อมและนามแฝงและการพิมพ์ข้อความเริ่มต้น (เช่น MOTD) สคริปต์เริ่มต้นใดที่เหมาะสมในการทำสิ่งเหล่านี้

ความแตกต่างระหว่างการวางสิ่งที่อยู่ใน.bashrc, .bash_profileและ.environment? ผมเคยเห็นยังไฟล์อื่น ๆ เช่น.login, .bash_loginและ.profile; สิ่งเหล่านี้เคยเกี่ยวข้องหรือไม่ อะไรคือความแตกต่างในสิ่งที่เรียกใช้เมื่อเข้าสู่ระบบทางกายภาพเข้าสู่ระบบจากระยะไกลผ่าน ssh และเปิดหน้าต่างเทอร์มินัลใหม่ มีความแตกต่างอย่างมีนัยสำคัญระหว่างแพลตฟอร์ม (รวมถึง Mac OS X (และ Terminal.app) และ Cygwin Bash) หรือไม่

คำตอบ:


73

ความแตกต่างที่สำคัญของไฟล์กำหนดค่าเชลล์คือบางไฟล์จะถูกอ่านโดยเชลล์ "ล็อกอิน" เท่านั้น (เช่นเมื่อคุณล็อกอินจากโฮสต์อื่นหรือล็อกอินที่คอนโซลข้อความของเครื่องยูนิกซ์ในเครื่อง) สิ่งเหล่านี้เรียกว่าพูด.loginหรือ.profileหรือ.zlogin(ขึ้นอยู่กับเชลล์ที่คุณใช้)

จากนั้นคุณมีไฟล์กำหนดค่าที่อ่านโดยเชลล์ "โต้ตอบ" (เช่นเดียวกับไฟล์ที่เชื่อมต่อกับเทอร์มินัล (หรือเทอร์มินัลหลอกในกรณีของการพูดว่าโปรแกรมจำลองเทอร์มินัลที่ทำงานภายใต้ระบบหน้าต่าง) สิ่งเหล่านี้คือไฟล์ที่มีชื่อ เช่น.bashrc, .tcshrc, .zshrcฯลฯ

bashความซับซ้อนนี้ในการที่.bashrcจะอ่านเพียงเปลือกที่ทั้งโต้ตอบและไม่ใช่การเข้าสู่ระบบดังนั้นคุณจะพบว่าคนส่วนใหญ่จบลงด้วยการบอกพวกเขา.bash_profileจะยังอ่าน.bashrcกับสิ่งที่ต้องการ

[[ -r ~/.bashrc ]] && . ~/.bashrc

เปลือกหอยอื่น ๆ ทำงานแตกต่างกัน - เช่นกับzsh, .zshrcจะอ่านเสมอสำหรับเปลือกโต้ตอบไม่ว่าจะเป็นการเข้าสู่ระบบอย่างใดอย่างหนึ่งหรือไม่

หน้าคู่มือสำหรับ bash จะอธิบายถึงสถานการณ์ที่แต่ละไฟล์ถูกอ่าน ใช่พฤติกรรมมักจะสอดคล้องกันระหว่างเครื่องจักร

.profileเป็นเพียงชื่อไฟล์สคริปต์การเข้าสู่ระบบเดิมที่ใช้โดย/bin/sh. bashซึ่งโดยทั่วไปจะเข้ากันได้กับแบบย้อนกลับ/bin/shจะอ่าน.profileว่ามีอยู่หรือไม่


48

ง่ายมาก มีอธิบายไว้ในman bash:

/bin/bash
       The bash executable
/etc/profile
       The systemwide initialization file, executed for login shells
~/.bash_profile
       The personal initialization file, executed for login shells
~/.bashrc
       The individual per-interactive-shell startup file
~/.bash_logout
       The individual login shell cleanup file, executed when a login shell exits
~/.inputrc
       Individual readline initialization file

ล็อกอินเชลล์เป็นเชลล์ที่อ่านได้เมื่อคุณล็อกอิน (ดังนั้นจึงไม่ถูกเรียกใช้งานเมื่อเริ่มต้น xterm เท่านั้น) มีวิธีอื่นในการเข้าสู่ระบบ ตัวอย่างเช่นการใช้ X display manager มีวิธีอื่นในการอ่านและส่งออกตัวแปรสภาพแวดล้อมในเวลาล็อกอิน

อ่านINVOCATIONบทในคู่มือด้วย มีข้อความระบุว่า"ย่อหน้าต่อไปนี้อธิบายวิธีที่ bash เรียกใช้ไฟล์เริ่มต้น" ฉันคิดว่านั่นเป็นสิ่งที่น่าสนใจ :) มันอธิบายว่าเชลล์ "โต้ตอบ" คืออะไร

.environmentทุบตีไม่ทราบเกี่ยวกับ ฉันสงสัยว่าเป็นไฟล์ของการแจกจ่ายของคุณเพื่อตั้งค่าตัวแปรสภาพแวดล้อมโดยไม่ขึ้นกับเชลล์ที่คุณขับ


1
คุณช่วยเติมเต็ม/etc/bashrcคำตอบได้ไหม
Nemoden

9

~/.profileBourne Shell ใช้แบบคลาสสิกและอาจได้รับการสนับสนุนโดย Bash เป็นมาตรการดั้งเดิม อีกครั้ง~/.loginและ~/.cshrcถูกใช้โดย C Shell - ฉันไม่แน่ใจว่า Bash ใช้พวกเขาทั้งหมด

~/.bash_profileจะถูกนำมาใช้ครั้งเดียวในการเข้าสู่ระบบ ~/.bashrcสคริปต์อ่านทุกครั้งที่มีเปลือกจะเริ่มต้น สิ่งนี้คล้ายคลึงกับ/.cshrcC Shell

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

ฉันเชื่อว่า~/.environmentไฟล์นี้เป็นไฟล์ที่เข้ากันได้สำหรับ Korn Shell


7

ฉันพบข้อมูลเกี่ยวกับ. bashrc และ. bash_profile ที่นี่เพื่อสรุป:

.bash_profile ถูกดำเนินการเมื่อคุณเข้าสู่ระบบ สิ่งที่คุณใส่อาจมี PATH และตัวแปรสภาพแวดล้อมที่สำคัญอื่น ๆ

.bashrc ใช้สำหรับเชลล์ที่ไม่ใช่ล็อกอิน ฉันไม่แน่ใจว่ามันหมายถึงอะไร ฉันรู้ว่า RedHat ดำเนินการทุกครั้งที่คุณเริ่มเชลล์อื่น (su กับผู้ใช้รายนี้หรือเรียกว่า bash อีกครั้ง) คุณอาจต้องการใส่นามแฝงในนั้น แต่อีกครั้งฉันไม่แน่ใจว่ามันหมายถึงอะไร ฉันไม่สนใจมันเอง

.profile เทียบเท่ากับ. bash_profile สำหรับรูท ฉันคิดว่าเปลี่ยนชื่อเพื่อให้เชลล์อื่น ๆ (csh, sh, tcsh) ใช้เช่นกัน (คุณไม่จำเป็นต้องเป็นผู้ใช้)

นอกจากนี้ยังมี. bash_logout ซึ่งดำเนินการที่ใช่เดาดี ... ออกจากระบบ คุณอาจต้องการหยุดมัคนายกหรือแม้แต่ทำความสะอาดเล็กน้อย คุณยังสามารถเพิ่มคำว่า "clear" ได้หากต้องการล้างหน้าจอเมื่อออกจากระบบ

นอกจากนี้ยังมีการติดตามไฟล์การกำหนดค่าแต่ละไฟล์ที่นี่

สิ่งเหล่านี้อาจขึ้นอยู่กับ distro ขึ้นอยู่กับ distros บางแห่งไม่ได้เลือกที่จะมีการกำหนดค่าแต่ละรายการกับพวกเขาและบางแห่งก็มีมากกว่านั้น แต่เมื่อมีชื่อเดียวกันก็มักจะรวมเนื้อหาเดียวกัน


4

ตามJosh Staiger Terminal.app ของMacOS X จะรันเชลล์ล็อกอินแทนที่จะเป็นเชลล์ที่ไม่ได้ล็อกอินตามค่าเริ่มต้นสำหรับหน้าต่างเทอร์มินัลใหม่แต่ละหน้าต่างเรียก. bash_profile แทน. bashrc

เขาแนะนำ:

เวลาส่วนใหญ่คุณไม่ต้องการรักษาไฟล์กำหนดค่าสองไฟล์แยกกันสำหรับล็อกอินและเชลล์ที่ไม่ใช่ล็อกอิน - เมื่อคุณตั้งค่า PATH คุณต้องการให้ใช้กับทั้งสองไฟล์ คุณสามารถแก้ไขได้โดยการจัดหา. bashrc จากไฟล์. bash_profile ของคุณจากนั้นใส่ PATH และการตั้งค่าทั่วไปใน. bashrc

ในการดำเนินการนี้ให้เพิ่มบรรทัดต่อไปนี้ใน. bash_profile:

if [ -f ~/.bashrc ]; then 
    source ~/.bashrc 
fi

ตอนนี้เมื่อคุณเข้าสู่ระบบเครื่องของคุณจากคอนโซล. bashrc จะถูกเรียก



0

ฉันมี distros Debian ครอบครัวสินค้าที่ปรากฏในการดำเนินการ.profileแต่ไม่ได้.bash_profileในขณะที่ RHEL อนุพันธ์ดำเนินการก่อน.bash_profile.profile

ดูเหมือนจะเป็นเรื่องวุ่นวายเมื่อคุณต้องตั้งค่าตัวแปรสภาพแวดล้อมเพื่อให้ทำงานในระบบปฏิบัติการ Linux ใด ๆ

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