Apa perbedaan antara .bashrc
dan .bash_profile
dan mana yang harus saya gunakan?
.profile
, lihat pertanyaan ini: superuser.com/questions/789448/…
Apa perbedaan antara .bashrc
dan .bash_profile
dan mana yang harus saya gunakan?
.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
:
if [ -r ~/.profile ]; then . ~/.profile; fi
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
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.
~/.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
Menurut halaman manual bash, .bash_profile dieksekusi untuk shell login, sedangkan .bashrc dieksekusi untuk shell non-login interaktif.
Apa itu shell login atau non-login?
Ketika Anda masuk (mis: ketik nama pengguna dan kata sandi) melalui konsol, baik secara fisik duduk di mesin saat boot, atau secara jarak jauh melalui ssh: .bash_profile dijalankan untuk mengonfigurasi hal-hal sebelum prompt perintah awal.
Tetapi, jika Anda sudah masuk ke mesin Anda dan membuka jendela terminal baru (xterm) di dalam Gnome atau KDE, maka .bashrc dieksekusi sebelum jendela command prompt. .bashrc juga dijalankan ketika Anda memulai instance bash baru dengan mengetik / bin / bash di terminal.
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
.$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 mengeluarkan ssh 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.
Untuk Bash, mereka bekerja sebagai berikut. Baca kolom yang sesuai. Menjalankan A, lalu B, lalu C, dll. B1, B2, B3 berarti hanya mengeksekusi yang pertama dari file-file yang ditemukan.
+----------------+-----------+-----------+------+
| |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
? 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.) :
# 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)
Dan catatan ini ada di kepala masing-masing file pengaturan lainnya untuk merujuknya:
# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE
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.
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:
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
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 menghilangkan bash_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:
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