Mục đích của .bashrc là gì và nó hoạt động như thế nào?


Câu trả lời:


131

.bashrclà một kịch bản shell mà Bash chạy bất cứ khi nào nó được bắt đầu tương tác. Nó khởi tạo một phiên shell tương tác. Bạn có thể đặt bất kỳ lệnh nào trong tệp mà bạn có thể gõ tại dấu nhắc lệnh.

Bạn đặt các lệnh ở đây để thiết lập shell để sử dụng trong môi trường cụ thể của bạn hoặc để tùy chỉnh mọi thứ theo sở thích của bạn. Một điều phổ biến để đưa vào .bashrclà các bí danh mà bạn muốn luôn luôn có sẵn.

.bashrcchạy trên mỗi lần khởi động shell tương tác. Nếu bạn nói:

$ bash ; bash ; bash

và sau đó đánh Ctrl-Dba lần, .bashrcsẽ chạy ba lần. Nhưng nếu bạn nói điều này thay vào đó:

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

sau đó .bashrcsẽ không chạy, vì -clàm cho Bash gọi không tương tác. Điều tương tự cũng đúng khi bạn chạy một kịch bản shell từ một tệp.

Tương phản .bash_profile.profilechỉ được chạy khi bắt đầu một vỏ đăng nhập mới. ( bash -l) Bạn chọn xem một lệnh đi vào .bashrcso với .bash_profiletùy thuộc vào việc bạn muốn nó chạy một lần hay cho mỗi lần khởi động shell tương tác.

Là một ví dụ cho các bí danh, mà tôi thích đặt vào .bashrc, thay vào đó , bạn muốn thực hiện các PATHđiều chỉnh .bash_profile, vì những thay đổi này thường không phải là idempotent :

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

Nếu bạn đặt nó vào .bashrcthay vào đó, mỗi khi bạn khởi chạy một lớp vỏ phụ tương tác, :/some/additionsẽ được xử lý đến cuối của PATHmột lần nữa, tạo ra công việc bổ sung cho trình bao khi bạn gõ nhầm lệnh.

Bạn nhận được một vỏ Bash tương tác mới bất cứ khi nào bạn bao ra củavi với :sh, ví dụ.


6
Phân biệt nhỏ: không giống như hầu hết các shell khác, bash không tự động tải tệp cấu hình theo trường hợp .bashrckhi nó bắt đầu như một vỏ đăng nhập. Điều này đôi khi có thể dẫn đến hành vi bất ngờ . Cách giải quyết thông thường là lấy nguồn .bashrctừ .profilehoặc .bash_profilethay vào đó.
Ilmari Karonen

@IlmariKaronen Vì .bashrckhông được sử dụng cho các loại vỏ khác, tốt hơn hết là không lấy nguồn từ .profileđó (có thể được sử dụng bởi các loại bashvỏ khác).
chepner

@IlmariKaronen những gì xảy ra (đọc: làm thế nào tôi có thể gỡ lỗi tại sao) khi source ~/.bashrchay . ~/.bashrchay [[ -f ~/.bashrc ]] && source. ~/.bashrchoặc [ -f ~/.bashrc ] && source ~/.bashrckhông làm việc?
Nikos Alexandris

@NikosAlexandris: Đó là một câu hỏi riêng biệt. Xin hỏi riêng .
Warren Young

@WarrenYoung Tôi sẽ nhưng tôi nhận ra rằng đó .bashrcthực sự có nguồn gốc (sử dụng lệnh được đề xuất từ superuser.com/a/183980/128768 ). Vấn đề tôi gặp phải thực sự là không tìm nguồn cung ứng https://github.com/junegunn/fzfthông qua lệnh này bên trong .bashrc: source ~/.fzf.bash. Tôi khởi chạy một thiết bị đầu cuối mới, sau đó Ctrl+ Rvà tôi nhận được `__fzf_history__`bash: fzf: command not found. Tôi nguồn thủ công .bashrcvà cùng một phím tắt khởi chạy fzf như mong đợi. Xin lỗi vì sự ồn ào ở đây.
Nikos Alexandris

20

Mục đích của .bashrctệp là cung cấp một nơi bạn có thể thiết lập các biến, hàm và bí danh, xác định lời nhắc (PS1) của bạn và xác định các cài đặt khác mà bạn muốn sử dụng mỗi khi bạn mở một cửa sổ đầu cuối mới.

Nó hoạt động bằng cách được chạy mỗi khi bạn mở một thiết bị đầu cuối, cửa sổ hoặc khung mới.

Bạn có thể thấy của tôi ở đây (pic với cú pháp tô sáng) :

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"

Giải trình:

-1. Thiết lập tệp lịch sử của tôi để bỏ qua các bản sao và lớn hơn nhiều so với mặc định.
-2. Tùy chọn màu cho lstùy thuộc vào việc bạn đang sử dụng linux hay OSX
-3. Hàm " md" để tạo và cd vào một thư mục với một lệnh
-4. Tìm nhánh git hiện tại nếu trong repo git và ...
-5. -9. Xác định một dấu nhắc PS1 tuyệt vời, như trong <code> 20:00:43 durrantm Castle2012 / hom / durrantm / Dropnot / _ / rails_apps / linker master \ n $ _ </ code>
-10. Cải thiện nhắc nhở PS2
-11. Đặt vi làm trình chỉnh sửa tại dòng lệnh
-12. Đặt vi làm trình chỉnh sửa mặc định
-13. thực hiện .bash_aliasestập tin của tôi nếu nó tồn tại
-14. Thực thi tập lệnh hoàn thành tab git của tôi (cho điều khiển từ xa và các nhánh) nếu nó tồn tại.
-15. Thực thi autojump nếu nó tồn tại
-16. Cho phép cd'ing mà không cần gõ phần cd nếu phiên bản bash> = 4
-17. Thực thi tập lệnh hoàn thành bash nếu nó tồn tại
-18. Sử dụng TMUX nếu nó có mặt
-19. Thêm rvm vào PATH của tôi
-20. Sử dụng rvm nếu nó tồn tại.

Tôi đã tạo bản di động này để nó hoạt động trên bất kỳ máy linux hoặc OSX nào của tôi mà không cần tùy chỉnh - do đó, một số thử nghiệm cho sự hiện diện được thực hiện trước khi sử dụng các chức năng nhất định và các tập lệnh khác.

Điều này cũng giúp dễ dàng sử dụng toàn bộ tệp ngay lập tức trên máy mới mà không gặp sự cố ảnh hưởng đến việc mở cửa sổ đầu cuối mới.


Quá mức cần thiết ...
Pacerier

Huh? quá hữu ích cho bạn?
Michael Durrant

2
Cảm ơn bạn rất nhiều vì đã chia sẻ. Rất nhiều thông tin ở đây.
Vic

7

Nó là một bashtập tin cấu hình.

Các shell tương tác (không đăng nhập), sau đó cấu hình được đọc từ các tệp này:

  • $HOME/.bashrc

Đối với shell Đăng nhập, cấu hình được đọc từ các tệp này:

  • /etc/profile (Luôn có nguồn gốc)
  • $HOME/.bash_profile (phần còn lại của các tệp này được kiểm tra theo thứ tự cho đến khi tìm thấy một tệp, sau đó không có tệp nào khác được đọc)
  • $HOME/.bash_login
  • $HOME/.profile

Minh họa đơn giản về cách thức / khi chúng được tải là trong hình dưới đây.

Tôi thêm một echođến tôi .bashrc.bash_profile

Shell tương tác vs shell đăng nhập

xem man bashđể biết thêm thông tin


2
Điều này không thực sự bổ sung giá trị bổ sung cho một câu hỏi cũ. Ngoài ra, tôi thấy rằng bạn chưa quen với Unix & Linux, cố gắng không đăng ảnh văn bản, thay vào đó, tốt hơn là sử dụng định dạng khối mã và sao chép từ bảng điều khiển của bạn. Điều này cho phép văn bản được tìm kiếm / sao chép / vv. Trong trường hợp ví dụ của bạn, thực sự không có bất kỳ lệnh phức tạp hoặc bất cứ điều gì tốt để tìm kiếm, nhưng thực hành tốt cho các câu trả lời khác.
Centimane

1
Tôi không chắc chắn tôi hoàn toàn hiểu tài liệu tham khảo của bạn về 'câu hỏi cũ' Nó nằm trong danh sách câu hỏi hàng đầu và có liên quan với 60k lượt xem. Tôi nghĩ rằng giá trị gia tăng đến từ định dạng, trái ngược với hộp thoại / phỏng đoán như các câu trả lời trước đó. nhưng định dạng đã được chỉnh sửa là tốt. Tôi sẽ ghi nhớ ý kiến ​​của bạn về việc sử dụng các khối mã, cảm ơn.
Timothy LJ Stewart

2
Nó nằm trong đầu danh sách câu hỏi 'hoạt động' vì bạn đã đăng câu trả lời. Câu hỏi ban đầu được hỏi vào năm 2014, và chấp nhận một câu trả lời. Câu trả lời được chấp nhận nêu mục đích .bashrcvà phân biệt sự khác biệt giữa .bashrc.bash_profilebao gồm nội dung câu trả lời của bạn. Đừng nản lòng, bạn đưa ra một nỗ lực trung thực, nhưng cố gắng tập trung vào việc trả lời các câu hỏi với một số nội dung không nằm trong các câu trả lời khác.
Centimane
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.