Apa tujuan dari .bashrc dan bagaimana cara kerjanya?


Jawaban:


131

.bashrcadalah skrip shell yang dijalankan Bash setiap kali dijalankan secara interaktif. Ini menginisialisasi sesi shell interaktif. Anda bisa meletakkan perintah apa pun di file itu yang bisa Anda ketik di command prompt.

Anda menempatkan perintah di sini untuk mengatur shell untuk digunakan di lingkungan khusus Anda, atau untuk menyesuaikan hal-hal sesuai preferensi Anda. Hal yang umum untuk dimasukkan .bashrcadalah alias yang Anda ingin selalu tersedia.

.bashrcberjalan pada setiap peluncuran shell interaktif. Jika Anda mengatakan:

$ bash ; bash ; bash

dan kemudian tekan Ctrl-Dtiga kali, .bashrcakan berjalan tiga kali. Tetapi jika Anda mengatakan ini sebagai gantinya:

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

maka .bashrctidak akan berjalan sama sekali, karena -cmembuat panggilan Bash non-interaktif. Hal yang sama berlaku ketika Anda menjalankan skrip shell dari file.

Kontras .bash_profiledan .profileyang hanya berjalan di awal shell login baru. ( bash -l) Anda memilih apakah perintah masuk .bashrcvs .bash_profiletergantung pada apakah Anda ingin dijalankan sekali atau untuk setiap shell interaktif mulai.

Sebagai contoh berlawanan dengan alias, yang saya pilih untuk dimasukkan .bashrc, Anda ingin melakukan PATHpenyesuaian .bash_profile, karena perubahan ini biasanya tidak idempoten :

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

Jika Anda memasukkannya .bashrcsebagai gantinya, setiap kali Anda meluncurkan sub-shell interaktif, :/some/additionakan ditempelkan ke akhir PATHlagi, menciptakan kerja ekstra untuk shell ketika Anda salah ketik perintah.

Anda mendapatkan shell Bash interaktif baru setiap kali Anda keluarvi dengan :sh, misalnya.


6
Minor quibble: tidak seperti kebanyakan shell lainnya, bash tidak secara otomatis memuat file konfigurasi per-instance .bashrcketika dimulai sebagai shell login. Ini terkadang dapat menyebabkan perilaku yang tidak terduga . Solusi yang biasa digunakan adalah sumber .bashrcdari .profileatau .bash_profilesebagai gantinya.
Ilmari Karonen

@IlmariKaronen Karena .bashrctidak dimaksudkan untuk digunakan oleh shell lain, lebih baik untuk tidak mengambilnya .profile(yang mungkin digunakan oleh non- bashshell lain).
chepner

@IlmariKaronen apa yang terjadi (baca: bagaimana saya bisa men-debug mengapa) saat source ~/.bashrcatau . ~/.bashrcatau [[ -f ~/.bashrc ]] && source. ~/.bashrcatau [ -f ~/.bashrc ] && source ~/.bashrctidak bekerja?
Nikos Alexandris

@NikosAlexandris: Itu pertanyaan terpisah. Silakan tanyakan secara terpisah .
Warren Young

@ WarrenYoung Saya akan tetapi saya menyadari bahwa .bashrcmemang bersumber (menggunakan perintah yang direkomendasikan dari superuser.com/a/183980/128768 ). Masalah yang saya hadapi sebenarnya tidak sourcing dari https://github.com/junegunn/fzfmelalui perintah ini di dalam .bashrc: source ~/.fzf.bash. Saya meluncurkan terminal baru, kemudian Ctrl+ Rdan saya dapatkan `__fzf_history__`bash: fzf: command not found. Saya sumber secara manual .bashrcdan pintasan tombol yang sama meluncurkan fzf seperti yang diharapkan. Permintaan maaf untuk kebisingan di sini.
Nikos Alexandris

20

Tujuan suatu .bashrcfile adalah untuk menyediakan tempat di mana Anda dapat mengatur variabel, fungsi dan alias, menentukan prompt (PS1) Anda dan menetapkan pengaturan lain yang ingin Anda gunakan setiap mulai membuka jendela terminal baru.

Ini bekerja dengan dijalankan setiap kali Anda membuka terminal, jendela atau panel baru.

Anda dapat melihat milik saya di sini (foto dengan penyorotan sintaks) :

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"

Penjelasan:

-1. Setel file riwayat saya untuk mengabaikan duplikat dan jauh lebih besar dari standar.
-2. Pilihan warna untuk lsbergantung pada apakah Anda menggunakan linux atau OSX
-3. Fungsi " md" untuk membuat dan cd ke direktori dengan satu perintah
-4. Temukan cabang git saat ini jika dalam git repo dan ...
-5. -9. Definisikan prompt PS1 yang luar biasa, seperti pada <code> 20:00:43 durrantm Castle2012 / hom / durrantm / Dropnot / _ / rails_apps / master linker \ n $ _ </code>
-10. Peningkatan prompt PS2
-11. Tetapkan vi sebagai editor pada baris perintah
-12. Tetapkan vi sebagai editor default
-13. jalankan .bash_aliasesfile saya jika ada
-14. Jalankan skrip penyelesaian tab git saya (untuk remote dan cabang) jika ada.
-15. Jalankan autojump jika ada
-16. Izinkan cd'ing tanpa mengetikkan bagian cd jika versi bash> = 4
-17. Jalankan skrip penyelesaian bash jika ada
-18. Gunakan TMUX jika ada
-19. Tambahkan rvm ke PATH
-20 saya . Gunakan rvm jika ada.

Saya telah membuat portable ini sehingga bekerja pada sembarang mesin linux atau OSX saya tanpa penyesuaian - karenanya sejumlah tes untuk kehadiran dilakukan sebelum menggunakan fungsi-fungsi tertentu dan skrip lainnya.

Ini juga membuatnya lebih mudah untuk menggunakan seluruh file segera di mesin baru tanpa memiliki masalah yang mempengaruhi membuka jendela terminal baru.


Berlebihan ... ͏͏͏͏͏͏͏͏͏
Pacerier

Hah? terlalu membantu untukmu?
Michael Durrant

2
Terima kasih banyak telah berbagi. Banyak informasi di sini.
Vic

7

Ini adalah bashfile konfigurasi.

Kerang interaktif (non-login), maka konfigurasi dibaca dari file-file ini:

  • $HOME/.bashrc

Untuk shell Login, konfigurasi dibaca dari file-file ini:

  • /etc/profile (Selalu bersumber)
  • $HOME/.bash_profile (sisa file-file ini diperiksa secara berurutan sampai ditemukan, maka tidak ada yang lain dibaca)
  • $HOME/.bash_login
  • $HOME/.profile

Ilustrasi sederhana tentang bagaimana / kapan mereka dimuat adalah pada gambar di bawah ini.

Saya menambahkan echoke .bashrcdan.bash_profile

Shell interaktif vs. shell login

lihat man bashuntuk informasi lebih lanjut


2
Ini tidak benar-benar menambah nilai tambahan untuk pertanyaan lama. Juga, saya melihat bahwa Anda baru menggunakan Unix & Linux, cobalah untuk tidak memposting gambar teks, alih-alih lebih baik menggunakan pemformatan blok kode dan salin dari konsol Anda. Ini memungkinkan teks untuk dicari / disalin / etc. Dalam contoh Anda sebenarnya tidak ada perintah rumit atau apa pun yang baik untuk dicari, tetapi praktik yang baik untuk jawaban lainnya.
Centimane

1
Saya tidak yakin saya sepenuhnya memahami referensi Anda untuk 'pertanyaan lama'. Ini ada di daftar pertanyaan teratas, dan relevan dengan 60k tampilan. Saya pikir nilai tambah berasal dari format, yang bertentangan dengan dialog / dugaan seperti jawaban sebelumnya. tetapi formatnya sudah diedit juga. Saya akan mengingat komentar Anda tentang penggunaan blok kode, terima kasih.
Timothy LJ Stewart

2
Itu ada di bagian atas daftar pertanyaan 'aktif' karena Anda memposting jawaban. Pertanyaan ini awalnya ditanyakan pada tahun 2014, dan menerima jawaban. Jawaban yang diterima menyatakan tujuan .bashrcdan membedakan perbedaan antara .bashrcdan .bash_profileyang mencakup konten jawaban Anda. Jangan berkecil hati, Anda mengedepankan upaya jujur, tetapi cobalah untuk fokus pada menjawab pertanyaan dengan beberapa konten yang tidak tercakup oleh jawaban lain.
Centimane
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.