Perbedaan antara .bashrc dan .bash_profile
Apa perbedaan antara .bashrcdan .bash_profiledan mana yang harus saya gunakan?
Jawaban
Biasanya, ketika Anda masuk ke sistem Unix, sistem akan memulai satu program untuk Anda. Program itu adalah shell, yaitu program yang dirancang untuk menjalankan program lain. Ini adalah shell baris perintah: Anda memulai program lain dengan mengetikkan namanya. Shell default, Bourne shell, membaca perintah dari ~/.profilesaat dipanggil sebagai shell login.
Bash adalah cangkang mirip Bourne. Ia membaca perintah dari ~/.bash_profilesaat dipanggil sebagai shell login, dan jika file itu tidak ada¹, ia mencoba membaca ~/.profile.
Anda bisa memanggil shell secara langsung kapan saja, misalnya dengan meluncurkan emulator terminal di dalam lingkungan GUI. Jika shell bukan shell login, ia tidak membaca ~/.profile. Saat Anda memulai bash sebagai shell interaktif (yaitu, bukan untuk menjalankan skrip), bash akan membaca ~/.bashrc(kecuali jika dipanggil sebagai shell login, maka bash hanya membaca ~/.bash_profileatau ~/.profile.
Karena itu:
~/.profileadalah tempat untuk meletakkan hal-hal yang berlaku untuk seluruh sesi Anda, seperti program yang ingin Anda mulai saat Anda masuk (tetapi bukan program grafis, mereka masuk ke file yang berbeda), dan definisi variabel lingkungan.~/.bashrcadalah tempat untuk meletakkan hal-hal yang hanya berlaku untuk bash itu sendiri, seperti definisi alias dan fungsi, opsi shell, dan pengaturan prompt. (Anda juga bisa meletakkan key binding di sana, tetapi untuk bash biasanya digunakan~/.inputrc.)~/.bash_profiledapat digunakan sebagai pengganti~/.profile, tetapi hanya dapat dibaca oleh bash, bukan oleh shell lain. (Ini sebagian besar menjadi perhatian jika Anda ingin file inisialisasi Anda bekerja pada banyak mesin dan shell login Anda tidak melakukan bash pada semuanya.) Ini adalah tempat yang logis untuk disertakan~/.bashrcjika shell bersifat 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 kesatuan modern, ada komplikasi tambahan terkait dengan ~/.profile. Jika Anda masuk dalam lingkungan grafis (yaitu, jika program tempat Anda mengetik kata sandi berjalan dalam mode grafik), Anda tidak secara otomatis mendapatkan shell masuk yang bertuliskan ~/.profile. Bergantung pada program login grafis, pada window manager atau lingkungan desktop yang Anda jalankan setelahnya, dan pada bagaimana distribusi Anda mengkonfigurasi program-program ini, Anda ~/.profilemungkin atau mungkin tidak membaca. Jika tidak, biasanya ada tempat lain di mana Anda dapat menentukan variabel lingkungan dan program untuk diluncurkan saat Anda masuk, tetapi sayangnya tidak ada lokasi standar.
Perhatikan bahwa Anda mungkin melihat di sana-sini rekomendasi untuk memasukkan definisi variabel lingkungan ~/.bashrcatau selalu meluncurkan shell login di terminal. Keduanya adalah ide yang buruk. Masalah paling umum dengan salah satu ide ini adalah variabel lingkungan Anda hanya akan disetel 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_profiletidak ada, bash juga mencoba .bash_loginsebelum kembali ke .profile. Jangan ragu untuk melupakannya.
Dari artikel singkat ini
Menurut halaman manual bash, .bash_profile dijalankan untuk shell login, sedangkan .bashrc dijalankan untuk shell non-login interaktif.
Apa itu shell login atau non-login?
Saat Anda login (misalnya: ketik nama pengguna dan kata sandi) melalui konsol, baik secara fisik duduk di mesin saat boot, atau dari jarak jauh melalui ssh: .bash_profile dijalankan untuk mengkonfigurasi hal-hal sebelum prompt perintah awal.
Tetapi, jika Anda telah masuk ke komputer Anda dan membuka jendela terminal baru (xterm) di dalam Gnome atau KDE, maka .bashrc akan dijalankan sebelum jendela command prompt. .bashrc juga dijalankan saat Anda memulai instance bash baru dengan mengetik / bin / bash di terminal.
Kembali ke masa lalu, ketika pseudo tty tidak semu dan sebenarnya, yah, diketik, dan UNIX diakses oleh modem sangat lambat sehingga Anda dapat melihat setiap huruf dicetak ke layar Anda, efisiensi adalah yang terpenting. Untuk membantu efisiensi, Anda memiliki konsep jendela masuk utama dan jendela lain apa pun yang Anda gunakan untuk bekerja. Di jendela utama Anda, Anda ingin pemberitahuan ke setiap email baru, mungkin menjalankan beberapa program lain di latar belakang.
Untuk mendukung ini, shell mengambil file .profilesecara khusus pada 'login shells'. Ini akan melakukan pengaturan khusus, sekali sesi. Bash memperluas ini agak untuk melihat .bash_profile terlebih dahulu sebelum .profile, dengan cara ini Anda hanya dapat meletakkan bash di sana (sehingga mereka tidak mengacaukan Bourne shell, dll, yang juga melihat .profile). Kerang lain, non-login, hanya akan mengambil file rc, .bashrc (atau .kshrc, dll).
Ini sedikit anakronisme sekarang. Anda tidak masuk ke shell utama sebanyak Anda masuk ke pengelola jendela gui. Tidak ada jendela utama yang berbeda dari jendela lainnya.
Saran saya - jangan khawatir tentang perbedaan ini, ini didasarkan pada gaya lama menggunakan unix. Kurangi perbedaan pada file Anda. Seluruh konten .bash_profile harus:
[ -f $HOME/.bashrc ] && . $HOME/.bashrc
Dan letakkan semua yang sebenarnya ingin Anda setel di .bashrc
Ingatlah bahwa .bashrc bersumber untuk semua shell, interaktif dan non-interaktif. Anda dapat melakukan hubungan pendek sumber untuk shell non-interaktif dengan meletakkan kode ini di dekat bagian atas .bashrc:
[[ $- != *i* ]] && return
Lihatlah posting blog yang luar biasa ini oleh ShreevatsaR . Ini ekstraknya, tapi buka posting blog, itu termasuk penjelasan untuk istilah seperti "shell login", diagram alir, dan tabel serupa untuk Zsh.
Untuk Bash, mereka bekerja sebagai berikut. Bacalah kolom yang sesuai. Jalankan A, lalu B, lalu C, dll. B1, B2, B3 berarti hanya mengeksekusi file pertama 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 | | |
+----------------+-----------+-----------+------+
KOMENTAR LEBIH BAIK UNTUK KEPALA / DLL / PROFIL
Berdasarkan jawaban bagus Flimm di atas, saya memasukkan komentar baru ini di kepala Debian saya /etc/profile, (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 di bagian atas setiap file setup lainnya sebagai referensi:
# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE
Perlu dicatat, menurut saya adalah Debian /etc/profilesecara default sumber (termasuk) /etc/bash.bashrc, (saat itulah /etc/bash.bashrcada). Jadi skrip login membaca kedua /etcfile, sedangkan non-login hanya membaca bash.bashrc.
Yang juga perlu diperhatikan adalah yang /etc/bash.bashrcdiatur untuk tidak melakukan apa pun saat tidak berjalan secara interaktif. Jadi kedua file ini hanya untuk skrip interaktif.
Logika konfigurasi bash itu sendiri tidak rumit dan dijelaskan dalam jawaban lain di halaman ini, di serverfault dan di banyak blog. Namun masalahnya adalah apa yang dibuat oleh distribusi Linux tentang bash , maksud saya kompleks dan berbagai cara mereka mengkonfigurasi bash secara default.http://mywiki.wooledge.org/DotFilesmenyebutkan beberapa kebiasaan ini secara singkat. Berikut salah satu contoh jejak pada Fedora 29, ini menunjukkan sumber file mana yang file lain dan dalam urutan skenario yang sangat sederhana: menghubungkan jarak 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 kompleks Fedora ada di /etc/bashrc. Seperti yang terlihat di atas /etc/bashrcadalah file bash itu sendiri tidak tahu, maksud saya tidak secara langsung. Fedora /etc/bashrcmenguji apakah:
- itu bersumber dari shell login,
- itu bersumber dari shell interaktif,
- itu sudah bersumber
... dan kemudian melakukan hal yang sangat berbeda bergantung pada itu.
Jika Anda berpikir dapat mengingat grafik di atas maka sayang sekali karena itu hampir tidak cukup: grafik ini hanya menjelaskan satu skenario saja, hal-hal yang sedikit berbeda terjadi saat menjalankan skrip non-interaktif atau memulai sesi grafis. Saya telah menghilangkan ~/.profile. Saya telah menghilangkan bash_completionskrip. Untuk alasan kompatibilitas mundur, memanggil bash sebagai /bin/shganti /bin/bashperilakunya. Bagaimana dengan zsh dan cangkang lainnya? Dan tentu saja distribusi Linux yang berbeda melakukan hal yang berbeda, misalnya Debian dan Ubuntu datang dengan versi bas h non-standar , ia memiliki kustomisasi khusus Debian. Ini terutama terlihat untuk file yang tidak biasa: /etc/bash.bashrc. Bahkan jika Anda tetap menggunakan satu distribusi Linux, itu mungkin berkembang seiring waktu. Tunggu: kami bahkan belum menyentuh macOS, FreeBSD, ... Akhirnya, mari kita pikirkan pengguna yang terjebak dengan cara yang lebih kreatif lagi oleh admin mereka dalam mengonfigurasi sistem yang harus mereka gunakan.
Seperti yang ditunjukkan oleh aliran diskusi yang tidak pernah berakhir tentang topik ini, ini adalah tujuan yang hilang. Selama Anda hanya ingin menambahkan nilai baru, beberapa "coba-coba" cenderung sudah cukup. Kesenangan sesungguhnya dimulai ketika Anda ingin memodifikasi dalam satu file (pengguna) sesuatu yang sudah didefinisikan di file lain (di / etc). Kemudian bersiaplah untuk meluangkan waktu merancang solusi yang tidak akan pernah portabel.
Untuk kesenangan terakhir, berikut adalah "grafik sumber" untuk skenario sederhana yang sama di Clear Linux per 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