อะไรคือความแตกต่างระหว่าง.bashrc
และ.bash_profile
กับสิ่งที่ฉันควรใช้
.profile
ให้ดูที่คำถามนี้: superuser.com/questions/789448/…
อะไรคือความแตกต่างระหว่าง.bashrc
และ.bash_profile
กับสิ่งที่ฉันควรใช้
.profile
ให้ดูที่คำถามนี้: superuser.com/questions/789448/…
คำตอบ:
ตามเนื้อผ้าเมื่อคุณเข้าสู่ระบบ 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
อย่าลังเลที่จะลืมมันมีอยู่
~/.bash_profile
สามารถใช้~/.profile
~/.bashrc
คำสั่งแทนได้แต่คุณต้องรวมถ้าเชลล์เป็นแบบโต้ตอบ กำลังสร้างความเข้าใจผิดเนื่องจากเป็นปัญหามุมฉาก ไม่ว่าคุณจะใช้งาน~/.bash_profile
หรือ~/.profile
คุณต้องรวม~/.bashrc
ไว้ในที่คุณใช้หากคุณต้องการให้การตั้งค่าจากที่นั่นมีผลในเปลือกเข้าสู่ระบบ
~/.bashrc
มีบางอย่างที่เกี่ยวข้องกับการเลือก~/.bash_profile
แทน~/.profile
ซึ่งไม่เป็นความจริง หากมีบางคนรวม~/.bashrc
อยู่ในสคริปต์ชนิดใดก็ตามที่มีแหล่งที่มาในเวลาเข้าสู่ระบบ (ที่นี่เป็นอย่างใดอย่างหนึ่ง~/.bash_profile
หรือ~/.profile
) เป็นเพราะเขาต้องการให้การตั้งค่าจาก~/.bashrc
ที่จะนำไปใช้กับเปลือกเข้าสู่ระบบในลักษณะเดียวกัน
ตามหน้า bash man, .bash_profile จะถูกเรียกใช้งานสำหรับล็อกอินเชลล์ในขณะที่. bashrc ถูกเรียกใช้งานสำหรับเชลล์ที่ไม่ใช่ล็อกอินแบบโต้ตอบ
เชลล์สำหรับล็อกอินหรือที่ไม่ใช่ล็อกอินคืออะไร?
เมื่อคุณเข้าสู่ระบบ (เช่นพิมพ์ชื่อผู้ใช้และรหัสผ่าน) ผ่านคอนโซลไม่ว่าจะนั่งอยู่ที่เครื่องเมื่อบูตเครื่องหรือจากระยะไกลผ่าน ssh: .bash_profile
แต่ถ้าคุณได้ลงชื่อเข้าใช้เครื่องของคุณแล้วและเปิดหน้าต่างเทอร์มินัลใหม่ (xterm) ภายใน Gnome หรือ KDE ระบบจะดำเนินการ. bashrc ก่อนที่จะพร้อมรับคำสั่งของหน้าต่าง .bashrc ยังทำงานเมื่อคุณเริ่มอินสแตนซ์ bash ใหม่โดยพิมพ์ / bin / bash ในเทอร์มินัล
ย้อนกลับไปในสมัยก่อนเมื่อ 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
.$HOME/.bashrc
ที่อุดมไปด้วยแสดงให้เห็นข้างต้นการตั้งค่าใน.bashrc
จะสามารถใช้ได้ในเปลือกเข้าสู่ระบบและทำให้สภาพแวดล้อมเดสก์ทอปเช่นกัน ตัวอย่างเช่นในระบบ Fedora ของฉันgnome-session
เริ่มต้น-$SHELL -c gnome-session
ด้วยการ.profile
อ่าน
.bashrc
ใน.profile
โดยทั่วไปจะไม่ทำงานเพราะ.profile
อาจถูกดำเนินการโดย/bin/sh
และไม่ทุบตี (เช่นใน Ubuntu สำหรับการเข้าสู่ระบบแบบกราฟิกโดยค่าเริ่มต้น) และเชลล์นั้นอาจไม่สามารถทำงานแบบโต้ตอบได้ (เช่นสำหรับการเข้าสู่ระบบแบบกราฟิก)
[[ $- != *i* ]] && return
"); ฉันต้องการให้บางส่วนของฉัน.bashrc
ถูกเรียกใช้แม้สำหรับเชลล์ที่ไม่มีการโต้ตอบโดยเฉพาะเพื่อตั้งค่า env vars เมื่อออกssh hostname {command}
เพื่อให้คำสั่งรีโมตเรียกใช้งานได้อย่างถูกต้อง (แม้ว่าเชลล์ไม่ใช่แบบโต้ตอบ) แต่.bashrc
ควรละเว้นการตั้งค่าอื่น ๆ ในภายหลัง ฉันมักจะตรวจสอบ TERM = เป็นใบ้และ / หรือยกเลิกการตั้งค่าและประกันตัวออกมาก่อน
มีลักษณะที่นี้โพสต์บล็อกที่ยอดเยี่ยมโดย 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 | | |
+----------------+-----------+-----------+------+
[ -z "$PS1" ] && return
? ตารางในคำตอบของฉันคือให้รายการของสคริปต์ที่ดำเนินการโดย Bash โดยไม่คำนึงถึงเนื้อหาของสคริปต์หากสคริปต์มีบรรทัด[ -z "$PS1" ] && return
แน่นอนว่าจะมีผล แต่ฉันไม่คิดว่าควรจะเปลี่ยน โต๊ะ.
ความคิดเห็นที่ดีกว่าสำหรับส่วนหัว / 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 ถูกตั้งค่าเป็นไม่ทำอะไรเลยเมื่อมันไม่ทำงานแบบโต้ตอบ ดังนั้นทั้งสองไฟล์นี้มีไว้สำหรับสคริปต์แบบโต้ตอบเท่านั้น
ตรรกะการกำหนดค่าของ 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