วัตถุประสงค์ของ. bashrc คืออะไรและทำงานอย่างไร


คำตอบ:


131

.bashrcเป็นเชลล์สคริปต์ที่ Bash ทำงานเมื่อใดก็ตามที่เริ่มทำงานแบบโต้ตอบ มันเริ่มต้นเซสชั่นเปลือกโต้ตอบ คุณสามารถใส่คำสั่งใด ๆ ในไฟล์ที่คุณสามารถพิมพ์ได้ที่พรอมต์คำสั่ง

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

.bashrcทำงานในทุก ๆการเปิดตัวเชลล์ ถ้าคุณพูด:

$ bash ; bash ; bash

จากนั้นกดCtrl-Dสามครั้ง.bashrcจะทำงานสามครั้ง แต่ถ้าคุณพูดแบบนี้แทน:

$ bash -c exit ; bash -c exit ; bash -c exit

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

ความคมชัด.bash_profileและ.profileสิ่งที่เรียกใช้เมื่อเริ่มต้นของเชลล์ล็อกอินใหม่ ( bash -l) คุณเลือกว่าจะให้คำสั่งเป็นแบบ.bashrcVS หรือไม่.bash_profileขึ้นอยู่กับว่าคุณต้องการให้มันรันครั้งเดียวหรือทุกครั้งที่เชลล์แบบโต้ตอบเริ่มทำงาน

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

export PATH="$PATH:/some/addition"

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

คุณจะได้รับเปลือกทุบตีโต้ตอบใหม่เมื่อใดก็ตามที่คุณเปลือกออกของviด้วย:shยกตัวอย่างเช่น


6
การเล่นโวหารเล็กน้อย: ไม่เหมือนกับเชลล์อื่น ๆ ส่วนใหญ่ bash จะไม่โหลดไฟล์กำหนดค่าแบบต่ออินสแตนซ์โดยอัตโนมัติ.bashrcเมื่อเริ่มเป็นเชลล์การเข้าสู่ระบบ ซึ่งบางครั้งอาจจะนำไปสู่พฤติกรรมที่ไม่คาดคิด วิธีแก้ปัญหาตามปกติคือแหล่งที่มา.bashrcจาก.profileหรือ.bash_profileแทน
Ilmari Karonen

@IlmariKaronen เนื่องจาก.bashrcไม่ได้มีไว้สำหรับการใช้งานโดยเชลล์อื่น ๆ จึงไม่ควรที่จะหาแหล่งที่มาจากเชลล์.profile(ซึ่งอาจใช้โดยbashเชลล์อื่นที่ไม่ใช่เชลล์)
chepner

@IlmariKaronen จะเกิดอะไรขึ้น (อ่าน: ฉันจะแก้ปัญหาทำไม) เมื่อsource ~/.bashrcหรือ. ~/.bashrcหรือ[[ -f ~/.bashrc ]] && source. ~/.bashrcหรือ[ -f ~/.bashrc ] && source ~/.bashrcไม่ทำงาน?
Nikos Alexandris

@NikosAlexandris: นั่นเป็นคำถามแยกต่างหาก กรุณาขอให้มันแยกกัน
Warren Young

@WarrenYoung ฉันต้องการ แต่ฉันรู้ว่า.bashrcมันมีที่มาแน่นอน (ใช้คำสั่งที่แนะนำจากsuperuser.com/a/183980/128768 ) ปัญหาที่ผมต้องเผชิญเป็นจริงไม่ได้จัดหาhttps://github.com/junegunn/fzfผ่านทางคำสั่งนี้ภายใน:.bashrc source ~/.fzf.bashฉันเปิดอาคารผู้โดยสารแห่งใหม่แล้วCtrl+ และฉันได้รับR `__fzf_history__`bash: fzf: command not foundฉันมาด้วยตนเอง.bashrcและทางลัดคีย์เดียวกันจะเรียกใช้ fzf ตามที่คาดไว้ ขอโทษสำหรับเสียงที่นี่
Nikos Alexandris

20

วัตถุประสงค์ของ.bashrcไฟล์คือการให้สถานที่ที่คุณสามารถตั้งค่าตัวแปรฟังก์ชั่นและชื่อแทนกำหนดพรอมต์ (PS1) ของคุณและกำหนดการตั้งค่าอื่น ๆ ที่คุณต้องการใช้ทุกครั้งที่คุณเปิดหน้าต่างเทอร์มินัลใหม่

มันทำงานโดยการเรียกใช้ในแต่ละครั้งที่คุณเปิดหน้าต่างใหม่หรือเทอร์มินัล

คุณสามารถเห็นของฉันที่นี่(รูปที่มีการเน้นไวยากรณ์) :

HISTCONTROL=ignoreboth:erasedups HISTSIZE=100000 HISTFILESIZE=200000
ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
md () { [ $# = 1 ] && mkdir -p "$@" && cd "$@" || echo "Error - no directory passed!"; }
git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'; }
HOST='\033[02;36m\]\h'; HOST=' '$HOST
TIME='\033[01;31m\]\t \033[01;32m\]'
LOCATION=' \033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH
PS2='\[\033[01;36m\]>'
set -o vi # vi at command line
export EDITOR=vim
test -f ~/.bash_aliases && . $_
test -f ~/.git-completion.bash && . $_
test -s ~/.autojump/etc/profile.d/autojump && . $_
[ ${BASH_VERSINFO[0]} -ge 4 ] && shopt -s autocd
[ -f /etc/bash_completion ] && ! shopt -oq posix && . /etc/bash_completion
[ -z $TMUX ] && export TERM=xterm-256color && exec tmux
export PATH="$PATH:$HOME/.rvm/bin" # Add RVM to PATH for scripting
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$home/.rvm/scripts/rvm"

คำอธิบาย:

-1 ตั้งค่าไฟล์ประวัติของฉันเพื่อละเว้นรายการซ้ำและมีขนาดใหญ่กว่าค่าเริ่มต้น
-2 ตัวเลือกสีlsขึ้นอยู่กับว่าคุณใช้ linux หรือ OSX
-3 หรือไม่ ฟังก์ชัน " md" เพื่อสร้างและ cd ลงในไดเรกทอรีด้วยคำสั่งเดียว
-4 ค้นหาสาขา git ปัจจุบันหากอยู่ใน git repo และ ...
-5 -9 กำหนดพรอมต์ PS1 ที่ยอดเยี่ยมดังที่ใน<code> 20:00:43 durrantm Castle2012 / hom / durrantm / Dropnot / _ / rails_apps / linker master \ n $ _ </code>
-10 ปรับปรุง PS2 prompt
-11 ตั้งค่า vi เป็นเอดิเตอร์ที่บรรทัดรับคำสั่ง
-12 ตั้งค่า vi เป็นตัวแก้ไขเริ่มต้น
-13 รัน.bash_aliasesไฟล์ของฉันถ้ามันมีอยู่
-14 เรียกใช้สคริปต์การทำให้สมบูรณ์ของแท็บ git (สำหรับรีโมทและสาขา) หากมีอยู่
-15 ดำเนินการ autojump ถ้ามี
-16 อนุญาตให้ cd'ing โดยไม่ต้องพิมพ์ส่วนซีดีถ้ารุ่นทุบตี> = 4
-17 เรียกใช้งานสคริปต์การเติมเต็มของ bash หากมี
-18 ใช้ TMUX หากมี
-19 เพิ่ม rvm ใน PATH ของฉัน
-20 ใช้ rvm หากมีอยู่

ฉันทำแบบพกพานี้เพื่อให้ทำงานบนเครื่อง linux หรือ OSX ใด ๆ ของฉันโดยไม่มีการปรับแต่ง - ดังนั้นจึงมีการทดสอบจำนวนหนึ่งสำหรับการแสดงตนก่อนที่จะใช้ฟังก์ชั่นและสคริปต์อื่น ๆ

นอกจากนี้ยังทำให้การใช้ไฟล์ทั้งหมดในเครื่องใหม่ง่ายขึ้นโดยไม่มีปัญหาที่ส่งผลต่อการเปิดหน้าต่างเทอร์มินัลใหม่


เกินกำลัง ... ͏͏͏͏͏͏͏͏͏
Pacerier

ฮะ? มีประโยชน์เกินไปสำหรับคุณ
Michael Durrant

2
ขอบคุณมากสำหรับการแบ่งปัน. ความมั่งคั่งของข้อมูลที่นี่
Vic

7

มันเป็นbashไฟล์ปรับแต่ง

เชลล์แบบอินเทอร์แอกทีฟ (ไม่ใช่การเข้าสู่ระบบ) ดังนั้นการกำหนดค่าจะอ่านจากไฟล์เหล่านี้:

  • $HOME/.bashrc

สำหรับเชลล์การเข้าสู่ระบบการกำหนดค่าจะถูกอ่านจากไฟล์เหล่านี้:

  • /etc/profile (มีที่มาเสมอ)
  • $HOME/.bash_profile (ส่วนที่เหลือของไฟล์เหล่านี้จะถูกตรวจสอบตามลำดับจนกว่าจะพบหนึ่งแล้วไม่มีคนอื่นอ่าน)
  • $HOME/.bash_login
  • $HOME/.profile

ภาพประกอบง่าย ๆ ว่าโหลดเมื่อไรอยู่ในรูปภาพด้านล่าง

ฉันเพิ่มechoของฉัน.bashrcและ.bash_profile

เชลล์แบบโต้ตอบ vs ล็อกอินเชลล์

ดูman bashข้อมูลเพิ่มเติม


2
สิ่งนี้ไม่ได้เป็นการเพิ่มคุณค่าเพิ่มเติมให้กับคำถามเก่า ๆ นอกจากนี้ฉันเห็นว่าคุณยังใหม่กับ Unix & Linux พยายามอย่าโพสต์รูปภาพของข้อความแทนที่จะเป็นการดีกว่าที่จะใช้การจัดรูปแบบการบล็อกรหัสและคัดลอกจากคอนโซลของคุณ อนุญาตให้ค้นหาหรือคัดลอกข้อความได้ ในกรณีตัวอย่างของคุณไม่มีคำสั่งที่ซับซ้อนหรืออะไรที่จะดีในการค้นหา แต่เป็นการฝึกฝนที่ดีสำหรับคำตอบอื่น ๆ
Centimane

1
ฉันไม่แน่ใจว่าฉันเข้าใจการอ้างอิงของคุณอย่างสมบูรณ์เกี่ยวกับ 'คำถามเก่า' มันอยู่ในรายการคำถามยอดนิยมและเกี่ยวข้องกับการดู 60k ครั้ง ฉันคิดว่ามูลค่าเพิ่มมาจากรูปแบบซึ่งต่างจากการโต้ตอบ / การคาดเดาเช่นคำตอบก่อนหน้า แต่รูปแบบได้รับการแก้ไขเช่นกัน ฉันจะระลึกถึงความคิดเห็นของคุณเกี่ยวกับการใช้บล็อคโค้ดขอบคุณ
ทิโมธี LJ Stewart

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