Apa perbedaan antara .bashrc
dan .bash_profile
dan mana yang harus saya gunakan?
bash
bashrc
.bash-profile
cfischer
sumber
sumber
.profile
, lihat pertanyaan ini: superuser.com/questions/789448/…Jawaban:
Secara tradisional, ketika Anda masuk ke sistem Unix, sistem akan memulai satu program untuk Anda. Program itu adalah shell, yaitu program yang dirancang untuk memulai program lain. Ini adalah shell baris perintah: Anda memulai program lain dengan mengetikkan namanya. Shell default, shell Bourne, membaca perintah
~/.profile
ketika dipanggil sebagai shell login.Bash adalah cangkang mirip Bourne. Itu membaca perintah dari
~/.bash_profile
ketika dipanggil sebagai shell login, dan jika file itu tidak ada¹, ia mencoba membaca~/.profile
sebagai gantinya.Anda dapat memanggil shell secara langsung kapan saja, misalnya dengan meluncurkan emulator terminal di dalam lingkungan GUI. Jika shell bukan shell login, itu tidak membaca
~/.profile
. Ketika Anda memulai bash sebagai shell interaktif (yaitu, bukan untuk menjalankan skrip), bunyinya~/.bashrc
(kecuali ketika dipanggil sebagai shell login, maka itu hanya membaca~/.bash_profile
atau~/.profile
.Karena itu:
~/.profile
adalah tempat untuk meletakkan hal-hal yang berlaku untuk seluruh sesi Anda, seperti program yang ingin Anda mulai ketika Anda masuk (tetapi bukan program grafis, mereka masuk ke file yang berbeda), dan definisi variabel lingkungan.~/.bashrc
adalah tempat untuk meletakkan barang-barang yang hanya berlaku untuk bash itu sendiri, seperti alias dan definisi fungsi, opsi shell, dan pengaturan prompt. (Anda juga bisa meletakkan ikatan kunci di sana, tetapi untuk bash biasanya masuk~/.inputrc
.)~/.bash_profile
dapat digunakan sebagai ganti~/.profile
, tetapi dibaca oleh bash saja, bukan oleh shell lain. (Ini sebagian besar masalah jika Anda ingin file inisialisasi Anda berfungsi pada banyak mesin dan shell login Anda tidak bash pada semuanya.) Ini adalah tempat yang logis untuk memasukkan~/.bashrc
jika shell itu interaktif. Saya merekomendasikan konten berikut di~/.bash_profile
:Pada serikat modern, ada komplikasi tambahan yang terkait dengan
~/.profile
. Jika Anda masuk dalam lingkungan grafis (yaitu, jika program tempat Anda mengetik kata sandi Anda berjalan dalam mode grafis), Anda tidak secara otomatis mendapatkan shell login yang berbunyi~/.profile
. Bergantung pada program login grafis, pada window manager atau lingkungan desktop yang Anda jalankan sesudahnya, dan bagaimana distribusi Anda mengonfigurasi program-program ini, Anda~/.profile
mungkin membaca atau tidak. Jika tidak, biasanya ada tempat lain di mana Anda dapat mendefinisikan variabel dan program lingkungan untuk diluncurkan saat Anda masuk, tetapi sayangnya tidak ada lokasi standar.Perhatikan bahwa Anda dapat melihat di sini dan di sana rekomendasi untuk meletakkan definisi variabel lingkungan di
~/.bashrc
atau selalu meluncurkan shell login di terminal. Keduanya adalah ide yang buruk. Masalah yang paling umum dengan salah satu dari ide-ide ini adalah bahwa variabel lingkungan Anda hanya akan ditetapkan dalam program yang diluncurkan melalui terminal, bukan dalam program yang dimulai secara langsung dengan ikon atau menu atau pintasan keyboard.¹ Untuk kelengkapan, berdasarkan permintaan: jika
.bash_profile
tidak ada, bash juga mencoba.bash_login
sebelum kembali ke.profile
. Jangan ragu untuk melupakannya.sumber
~/.bash_profile
bisa digunakan sebagai ganti~/.profile
, tetapi Anda juga harus memasukkan~/.bashrc
jika shell itu interaktif. menyesatkan karena ini adalah masalah ortogonal. Tidak masalah jika Anda menggunakan~/.bash_profile
atau~/.profile
harus memasukkan~/.bashrc
yang Anda gunakan jika Anda ingin pengaturan dari sana berpengaruh di shell login.~/.bashrc
ada hubungannya dengan memilih~/.bash_profile
bukannya~/.profile
yang tidak benar. Jika seseorang memasukkan~/.bashrc
dalam jenis skrip apa pun yang bersumber pada waktu masuk (di sini salah satu~/.bash_profile
atau~/.profile
) karena ia ingin pengaturan~/.bashrc
diterapkan ke shell login dengan cara yang sama mereka diterapkan ke shell non-login.Dari artikel singkat ini
sumber
Kembali di masa lalu, ketika pseudo tty tidak pseudo dan sebenarnya, baik, diketik, dan UNIX diakses oleh modem sangat lambat Anda bisa melihat setiap huruf dicetak ke layar Anda, efisiensi sangat penting. Untuk membantu efisiensi, Anda memiliki konsep jendela masuk utama dan jendela apa pun yang Anda gunakan untuk bekerja. Di jendela utama Anda, Anda ingin pemberitahuan ke email baru apa pun, mungkin menjalankan beberapa program lain di latar belakang.
Untuk mendukung ini, shell mengambil file
.profile
secara khusus pada 'shell login'. Ini akan melakukan pengaturan sesi khusus, sekali. Bash memperluas ini agak untuk melihat .bash_profile terlebih dahulu sebelum .profile, dengan cara ini Anda bisa menaruh bash hanya hal-hal di sana (sehingga mereka tidak mengacaukan shell Bourne, dll, yang juga melihat .profile). Kerang lain, non-login, hanya akan sumber file rc, .bashrc (atau .kshrc, dll).Ini sedikit anakronisme sekarang. Anda tidak masuk ke shell utama sebanyak Anda masuk ke jendela manajer gui. Tidak ada jendela utama yang berbeda dari jendela lainnya.
Saran saya - jangan khawatir tentang perbedaan ini, ini didasarkan pada gaya lama menggunakan unix. Hilangkan perbedaan dalam file Anda. Seluruh konten .bash_profile harus:
[ -f $HOME/.bashrc ] && . $HOME/.bashrc
Dan letakkan semua yang Anda ingin atur di .bashrc
Ingat bahwa .bashrc bersumber untuk semua shell, interaktif dan non-interaktif. Anda dapat membuat arus pendek sumber untuk shell non-interaktif dengan meletakkan kode ini di dekat bagian atas .bashrc:
[[ $- != *i* ]] && return
sumber
.$HOME/.bashrc
seperti yang ditunjukkan Rich di atas, pengaturan di.bashrc
akan tersedia di shell login, dan juga lingkungan desktop. Misalnya, pada sistem Fedora saya,gnome-session
dimulai sebagai-$SHELL -c gnome-session
, begitu.profile
juga dibaca..bashrc
dalam.profile
biasanya tidak berfungsi, karena.profile
dapat dieksekusi oleh/bin/sh
dan bukan bash (mis. Pada Ubuntu untuk login grafis secara default), dan shell itu mungkin tidak interaktif (mis. Untuk login grafis).[[ $- != *i* ]] && return
"); Saya suka beberapa dari saya.bashrc
dieksekusi bahkan untuk shell non-interaktif, khususnya untuk mengatur env vars, ketika mengeluarkanssh hostname {command}
, sehingga perintah jarak jauh dijalankan dengan benar (meskipun shell tidak interaktif). Tetapi pengaturan lain di kemudian hari.bashrc
harus diabaikan. Saya biasanya memeriksa TERM = bodoh dan / atau tidak disetel, dan kemudian membayar lebih awal.Lihat posting blog yang luar biasa ini oleh ShreevatsaR . Berikut adalah ekstrak, tetapi pergi ke posting blog, itu termasuk penjelasan untuk istilah-istilah seperti "shell login", diagram alur, dan tabel serupa untuk Zsh.
sumber
[ -z "$PS1" ] && return
? Tabel dalam jawaban saya adalah memberikan daftar skrip yang dijalankan oleh Bash terlepas dari isi skrip, jika skrip itu sendiri memiliki garis[ -z "$PS1" ] && return
, tentu saja itu akan berpengaruh, tetapi saya tidak berpikir itu berarti saya harus mengubah meja.KOMENTAR YANG LEBIH BAIK UNTUK KEPALA / DLL / PROFIL
Berdasarkan jawaban Flimm yang luar biasa di atas, saya memasukkan komentar baru ini di kepala profil Debian / etc / saya, (Anda mungkin perlu menyesuaikannya untuk distro Anda.) :
Dan catatan ini ada di kepala masing-masing file pengaturan lainnya untuk merujuknya:
Perlu dicatat saya pikir adalah bahwa Debian / etc / profile oleh sumber default (termasuk) /etc/bash.bashrc (saat itulah /etc/bash.bashrc ada). Jadi skrip login membaca kedua file / etc, sementara non-login hanya membaca bash.bashrc.
Yang juga perlu diperhatikan adalah bahwa /etc/bash.bashrc diatur untuk tidak melakukan apa-apa ketika tidak dijalankan secara interaktif. Jadi kedua file ini hanya untuk skrip interaktif.
sumber
Logika konfigurasi bash sendiri tidak gila rumit dan dijelaskan dalam jawaban lain di halaman ini, pada serverfault dan di banyak blog. Namun masalahnya adalah apa yang membuat distribusi Linux bash , maksud saya rumit dan berbagai cara mereka mengkonfigurasi bash secara default. http://mywiki.wooledge.org/DotFiles menyebutkan beberapa kebiasaan ini secara singkat. Berikut ini satu contoh jejak pada Fedora 29, ini menunjukkan sumber file mana yang file lainnya dan urutan skenario yang sangat sederhana: menghubungkan dari jauh dengan ssh dan kemudian memulai subkulit lain:
Logika paling rumit Fedora adalah di
/etc/bashrc
. Seperti yang terlihat di atas/etc/bashrc
adalah file yang tidak diketahui oleh bash, maksud saya tidak secara langsung./etc/bashrc
Tes Fedora apakah:... dan kemudian melakukan hal-hal yang sangat berbeda tergantung pada itu.
Jika Anda berpikir dapat mengingat grafik di atas maka sangat buruk karena itu tidak cukup: grafik ini hanya menggambarkan satu skenario, hal-hal yang sedikit berbeda terjadi ketika menjalankan skrip non-interaktif atau memulai sesi grafis. Saya telah menghilangkan
~/.profile
. Saya telah menghilangkanbash_completion
skrip. Untuk alasan kompatibilitas ke belakang, gunakan bash sebagai/bin/sh
ganti/bin/bash
mengubah perilakunya. Bagaimana dengan zsh dan kerang lainnya? Dan tentu saja distribusi Linux yang berbeda melakukan hal-hal yang berbeda, misalnya Debian dan Ubuntu datang dengan versi non-standar dari bas , ia memiliki kustomisasi khusus Debian. Ini terutama mencari file yang tidak biasa:/etc/bash.bashrc
. Bahkan jika Anda tetap pada satu distribusi Linux saja, ia mungkin berkembang seiring waktu. Tunggu: kami bahkan belum menyentuh macOS, FreeBSD, ... Akhirnya, mari kita pikirkan pengguna yang terjebak dengan cara yang bahkan lebih kreatif, admin mereka telah mengkonfigurasi sistem yang harus mereka gunakan.Seperti yang didemonstrasikan oleh arus diskusi tanpa henti tentang topik ini, itu adalah tujuan yang hilang. Selama Anda hanya ingin menambahkan nilai-nilai baru, beberapa "coba-coba" cenderung cukup. Kegembiraan yang sebenarnya dimulai ketika Anda ingin memodifikasi dalam satu (pengguna) file sesuatu yang sudah didefinisikan dalam yang lain (di / etc). Kemudian bersiaplah untuk meluangkan waktu merancang solusi yang tidak akan pernah portabel.
Untuk kesenangan terakhir, inilah "grafik sumber" untuk skenario yang sama dan sederhana pada Clear Linux pada Juni 2019:
sumber