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


245

เพื่อให้นามแฝงสำหรับเทอร์มิใน OS X คุณสามารถใส่ชื่อแทนในหรือ.bash_profile .bashrcอะไรคือความแตกต่างระหว่างทั้งสองและทำไมฉันถึงเลือกที่จะใส่ชื่อแทนในอันหนึ่งและไม่ใช่อีกอัน?


5
อย่าขัดขวางความรู้ของยูนิกซ์ที่นี่ แต่การทุบตีเป็นสัตว์ร้ายที่มีระบบปฏิบัติการยูนิกซ์ที่บริสุทธิ์ดังนั้นคุณอาจได้รับความรู้ที่ดีขึ้นหรือให้คำถามนี้ตอบไปหลายครั้งในเว็บไซต์พันธมิตร มีคำถามและคำตอบ bashrc มากกว่า 200 คู่บนยูนิกซ์
bmike

มี. profile เช่นกัน ... ดูคำถามนี้ใน Stack Overflow
ยาคอฟบารุค

2
หากคุณbrew install bashและใช้ iTerm2 คุณสามารถตั้งค่าprofile -> commandให้/usr/local/bin/bashโหลด.bashrcตามค่าเริ่มต้นหลังจาก.bash_profileนั้น สิ่งนี้จะช่วยให้คุณสารพัด Bash 4 ...
Ray Foss

ฉันได้ยินมาว่า. bashrc ไม่ได้ใช้มานานหลายปีและโดยค่าเริ่มต้นจะไม่ทำงานและ. bash_profile เป็นสิ่งที่อยู่ใน macosx และฉันพยายาม. bashrc และ t ใช้งานไม่ได้สำหรับฉัน แต่. bash_profile ทำ
barlop

คำตอบ:


247

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

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

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

บน OS X โดยค่าเริ่มต้นเทอร์มินัลจะเรียกใช้เชลล์การเข้าสู่ระบบทุกครั้งดังนั้นนี่จะแตกต่างกันเล็กน้อยกับระบบอื่น ๆ ส่วนใหญ่ แต่คุณสามารถกำหนดค่าในการกำหนดค่าตามความชอบ


57
On OS X, Terminal by default runs a login shell every time- ฉันสับสนมาตลอดโดยไม่รู้ตัว ข้อมูลยอดเยี่ยม!
vaughan

1
@Alex ทำไมเทอร์มินัล OS X จะเรียกใช้เชลล์การเข้าสู่ระบบทุกครั้ง
Pacerier

17
เพราะแอปเปิ้ล dev บางตัวไม่ได้ตระหนักถึงความแตกต่างในตอนแรกและตอนนี้มันได้รับการยืนยันในจัมโบ้ขนาดใหญ่
Snowcrash

2
ฉันใช้ OS X และฉันใช้ zshell แทนทุบตีและ iTerm แทน Terminal แม้ว่าที่จริงแล้วฉันกำลังใช้เทอร์มินัลที่แตกต่างกันและเชลล์ที่แตกต่างจากคำตอบที่กล่าวถึง OS X ยังคงพิจารณาทุกอย่างของเชลล์ล็อกอินเพราะ.zprofileได้รับการรันทุกครั้ง
อดัม Zerner

1
สำหรับผู้ที่กำลังมองหาคำอธิบายอย่างละเอียดของการรวมกันของเปลือกหอยเข้าสู่ระบบ / ไม่เข้าสู่ระบบและแบบโต้ตอบ / ไม่โต้ตอบและเมื่อพวกเขาเรียกใช้ไฟล์ config เหล่านี้ดูunix.stackexchange.com/a/46856/38715
kevinmicke

45

X11 จะมองคุณ.bashrcในขณะที่เทอร์มินัล "ปกติ" จะมอง.bash_profile

อย่างไรก็ตามหากคุณเพิ่มสิ่งต่อไปนี้ในของ.bash_profileคุณคุณสามารถย้ายทุกอย่างลงใน.bashrcไฟล์ของคุณเพื่อรวมทุกอย่างไว้ในที่เดียวแทนที่จะเป็นสอง:

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

cd ~ ; ln -s .bashrc .bash_profileหรือคุณก็สามารถทำได้
LHF

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

3
@danielAzuelos: Lurch ออกจากส่วนนี้ แต่แหล่งที่มาของเทอร์มินัล OS X ~/.bash_profileสำหรับหน้าต่าง / แท็บใหม่ทุกครั้งดังนั้นจึงไม่มีทางแยกทั้งสองได้เท่าที่เทอร์มินัลเกี่ยวข้อง
mipadi

14
@mipadi ยังคงมีค่าที่จะแยกพวกเขา ตัวอย่างเช่น.bash_profileไม่สามารถจัดหาได้อีกครั้งในกระบวนการลูก แหล่งข้อมูล Bash ที่ซ้อนกันทุกระดับ.bashrcดังนั้นหากคุณใส่สิ่งที่ชอบexport A=a:$Aเข้าไป.bashrcคุณ$Aจะได้รับ Bash ที่ซ้อนกันนานขึ้น ฉันมักจะออกจากตัวแปรสภาพแวดล้อมในโปรไฟล์และนามแฝงใน RC
Franklin Yu

@ FranklinYu อาจจะไม่ใช่เรื่องใหญ่สำหรับหลาย ๆ คน แต่ฉันเห็นด้วยอย่างยิ่ง! มันเป็นจุดทางเทคนิคที่ยอดเยี่ยมในการเตือนผู้คนและสมควรได้รับการโหวตมากขึ้น
Subfuzion

24

สำหรับ macOS รหัสที่จะใส่.bash_profileเพื่อรวมทุกอย่างเข้าไว้.bashrcมีดังนี้:

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

นี่คือเฉพาะเจาะจงมากขึ้นสำหรับผู้ใช้ terminal Mac


6
ในขณะที่เป็นจริงสิ่งนี้แตกต่างจากคำตอบของ Lurch จาก 2012อย่างไร
Arjan

0

TLDR; ใช้.bash_profileสำหรับนามแฝงของคุณ

วิธีที่ไฟล์เริ่มต้นทำงานร่วมกันมีความซับซ้อนมากขึ้นเล็กน้อยและมีบางกรณีพิเศษที่สำคัญใน OSX นี่คือไฮไลท์:

  • Bash บนแพลตฟอร์มใด ๆ เรียกใช้งานหนึ่งในหลาย ๆ ไฟล์ที่แตกต่างกันขึ้นอยู่กับวิธีการเรียกใช้ โดยมีรายละเอียดที่นี่
  • แอป Terminal ของ OSX ทำบางสิ่งที่ไม่ได้มาตรฐาน: สร้างทุกแท็บหรือหน้าต่างใหม่ราวกับว่ามันเป็นเชลล์ล็อกอินซึ่งหมายความว่า.bash_profileมันถูกเรียก ดังนั้นคำแนะนำ TLDR ด้านบน
  • .bashrcเป็นตัวเลือกเช่นกัน แต่จะถูกเรียกทุกครั้งที่คุณสร้าง subshell (เช่นเรียกใช้bash) ซึ่งสามารถสร้างความไม่มีประสิทธิภาพได้หากคุณอัปเดตตัวแปรภายใน (เช่นPATH=/bin/foo:$PATH)
  • แอพอื่น ๆ ที่มีเทอร์มินัลฝังตัวสามารถเลือกที่จะทำตามแบบแผนของแอพ Terminal ได้หรือไม่ ยวดVisual Studio รหัสตามค่าเริ่มต้นไม่ได้
  • แอพที่เรียกใช้ผ่าน GUI จะไม่เกิดจากเปลือก ดังนั้นจึงมีกลไกการแข่งขันหลายสำหรับการตั้งค่าตัวแปรสภาพแวดล้อมสำหรับพวกเขาที่จะเห็นที่มีการเปลี่ยนแปลงในช่วงปีที่ผ่านมา
  • ตัวอย่างที่โทร.bashrcมา.bash_profileเป็นเรื่องธรรมดา ฉันไม่แนะนำ แต่เป็นความชอบ

เหตุใดการใช้.bash_profileชื่อแทนจึงซับซ้อน? รายการที่คุณแสดงเพียงบางส่วนนั้นเกี่ยวกับนามแฝงเลยดังนั้นแทนที่จะแสดงรายการสัญลักษณ์แสดงหัวข้อย่อยซึ่งอาจอธิบายได้ว่าทำไมมันจึงดูซับซ้อนคุณอาจเสนอวิธีที่จะทำให้ง่ายขึ้นภายในข้อ จำกัด เหล่านี้
nohillside

ฉันเห็นประเด็นของคุณ ไม่ใช่ว่าการใช้. bash_profile นั้นซับซ้อน มันเป็นวิธีที่ไฟล์ถูกเรียกมีความซับซ้อน ฉันจะอัปเดต
Leo

แนะนำให้ใช้การเรียก. bashrc จาก. bash_profile ในคู่มือการทุบตี GNU - มิฉะนั้นคุณจะตั้งค่าตัวแปร ฯลฯ อย่างไรที่คุณต้องการทั้งในการเข้าสู่ระบบเปลือกและที่ไม่ใช่ intereactive?
ทำเครื่องหมาย

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