Pertanyaan Perbedaan antara .bashrc dan .bash_profile


Apa perbedaannya .bashrc dan .bash_profile dan mana yang harus saya gunakan?


401
2017-09-02 14:40


asal


Lihat juga pertanyaan serupa ini di ubuntu.stackexchange.com/questions/1528/bashrc-or-bash-profile - Stefan Lasiewski
Jika Anda menginginkan penjelasan yang lebih lengkap yang juga melibatkan .profile, lihat pertanyaan ini: superuser.com/questions/789448/… - Flimm
Jawaban ini juga mencakup beberapa aspek stackoverflow.com/questions/415403/… - Sergey Voronezhskiy


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 command line: Anda memulai program lain dengan mengetikkan namanya. Shell default, shell Bourne, membaca perintah dari ~/.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, itu 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, ia tidak akan membaca ~/.profile. Ketika Anda memulai bash sebagai shell interaktif (yaitu, untuk tidak menjalankan skrip), itu berbunyi ~/.bashrc (kecuali ketika dipanggil sebagai shell login, maka itu hanya berbunyi ~/.bash_profile atau ~/.profile.

Karena itu:

  • ~/.profile adalah tempat untuk meletakkan barang-barang yang berlaku untuk seluruh sesi Anda, seperti program yang ingin Anda mulai ketika Anda masuk (tetapi tidak 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 cepat. (Anda juga bisa menempatkan binding kunci di sana, tetapi untuk bash yang biasanya mereka masuki ~/.inputrc.)

  • ~/.bash_profile dapat digunakan sebagai gantinya ~/.profile, tetapi dibaca oleh bash saja, tidak dengan shell lain. (Ini sebagian besar menjadi perhatian jika Anda ingin file inisialisasi Anda bekerja pada beberapa mesin dan shell login Anda tidak menyerang 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 persatuan modern, ada komplikasi tambahan terkait ~/.profile. Jika Anda masuk dalam lingkungan grafis (yaitu, jika program di mana Anda mengetik kata sandi Anda sedang berjalan dalam mode grafis), Anda tidak secara otomatis mendapatkan shell login yang bertuliskan ~/.profile. Bergantung pada program masuk grafis, pada manajer jendela atau lingkungan desktop yang Anda jalankan sesudahnya, dan bagaimana distribusi Anda mengonfigurasi program-program ini, ~/.profile mungkin atau mungkin tidak dibaca. Jika tidak, biasanya ada tempat lain di mana Anda dapat menentukan variabel lingkungan dan program yang akan diluncurkan ketika Anda masuk, tetapi sayangnya tidak ada lokasi standar.

Perhatikan bahwa Anda dapat melihat di sini dan di sana rekomendasi untuk memasukkan 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 gagasan ini adalah bahwa variabel lingkungan Anda hanya akan diatur dalam program yang diluncurkan melalui terminal, bukan dalam program yang dimulai langsung dengan ikon atau menu atau pintasan keyboard.

¹  Untuk kelengkapan, atas permintaan: jika .bash_profile tidak ada, bash juga mencoba .bash_loginsebelum jatuh kembali .profile. Jangan ragu untuk melupakannya.  


471
2017-09-02 19:23



+1 untuk pos yang bagus. JUGA, terima kasih telah menambahkan bagian tentang "login graphical vs login shell" ... Saya memiliki masalah di mana saya pikir ~ / .profile akan SELALU mengeksekusi untuk grafis / shell ... tetapi tidak mengeksekusi ketika pengguna masuk melalui login grafis. Terima kasih telah menyelesaikan misteri itu. - Trevor Boyd Smith
@Gilles: Bisakah Anda menjelaskan secara lebih detail, dengan contoh, mengapa menjalankan shell login di setiap terminal adalah ide yang buruk? Apakah ini hanya masalah dengan Linux desktop? (Saya menyimpulkan bahwa di OS X Terminal menjalankan cangkang login setiap kali, dan saya tidak pernah memperhatikan efek samping apa pun (meskipun saya biasanya menggunakan iTerm). Tetapi kemudian saya tidak dapat memikirkan banyak variabel lingkungan yang saya pedulikan di luar sebuah terminal. (Mungkin HTTP_PROXY?)) - iconoclast
@Brandon Jika Anda menjalankan shell login di setiap terminal, itu akan menggantikan variabel lingkungan yang disediakan oleh lingkungan. Dalam situasi sehari-hari, Anda bisa lolos dengan itu, tetapi itu akan datang dan menggigit Anda cepat atau lambat, ketika Anda ingin mengatur variabel yang berbeda di terminal (misalnya, untuk mencoba versi program yang berbeda): menjalankan shell login akan menimpa pengaturan lokal Anda. - Gilles
Pernyataan ~/.bash_profile dapat digunakan sebagai gantinya ~/.profile, tetapi Anda juga harus memasukkan ~/.bashrc jika shell itu interaktif. menyesatkan karena ini adalah masalah ortogonal. Tidak masalah jika Anda gunakan ~/.bash_profile atau ~/.profile Anda harus memasukkan ~/.bashrc dalam yang Anda gunakan jika Anda ingin pengaturan dari sana memiliki efek di shell login. - Piotr Dobrogost
@Gilles Tentu, tetapi cara kalimat itu dirumuskan dalam jawaban menunjukkan bahwa perlu dimasukkan ~/.bashrc ada hubungannya dengan memilih ~/.bash_profile dari pada ~/.profile itu tidak benar. Jika seseorang termasuk ~/.bashrc dalam segala jenis naskah yang bersumber pada waktu masuk (di sini itu baik ~/.bash_profile atau ~/.profile) karena dia ingin pengaturan dari ~/.bashrc untuk diterapkan ke shell login dengan cara yang sama seperti yang diterapkan pada shell non-login. - Piotr Dobrogost


Dari ini artikel singkat

Menurut halaman manual bash,   .bash_profile dieksekusi untuk login   kerang, sementara .bashrc dijalankan untuk   shell non-login interaktif.

Apa itu cangkang login atau non-login?

Ketika Anda masuk (misalnya: ketik nama pengguna dan   kata sandi) melalui konsol, baik   secara fisik duduk di mesin kapan   boot, atau dari jarak jauh melalui ssh:   .bash_profile dijalankan untuk mengkonfigurasi   hal-hal sebelum perintah awal   cepat.

Tapi, jika Anda sudah masuk   mesin Anda dan buka terminal baru   jendela (xterm) di dalam Gnome atau KDE,   Kemudian .bashrc dijalankan sebelum   prompt perintah jendela. .bashrc juga   dijalankan saat Anda memulai instance bash baru   dengan mengetik / bin / bash di terminal.


50
2017-09-02 14:54



Pembaruan sedikit: 'Dieksekusi' mungkin istilah yang sedikit menyesatkan, keduanya bersumber. Suara yang dieksekusi seperti dijalankan sebagai skrip, fork / exec yadda yadda. Ini dijalankan dalam konteks shell saat ini Lebih penting lagi, .bashrc dijalankan jauh lebih sering. Ini dijalankan pada setiap skrip bash dijalankan, dan juga jika Anda tidak memiliki .bash_profile. Juga, tergantung bagaimana Anda mengatur xterms Anda, Anda dapat membuat shell yang menjadi sumber .bash_profile - Rich Homolka


Kembali di masa lalu, ketika pseudo tty tidak semu dan sebenarnya, baik, diketik, dan UNIX diakses oleh modem sehingga lambat Anda bisa melihat setiap huruf yang dicetak ke layar Anda, efisiensi adalah yang terpenting. Untuk membantu efisiensi, Anda memiliki konsep jendela login utama dan jendela lain apa pun yang Anda gunakan untuk benar-benar berfungsi. Di jendela utama Anda, Anda ingin pemberitahuan untuk setiap surat baru, mungkin menjalankan beberapa program lain di latar belakang.

Untuk mendukung ini, cangkang bersumber file .profile khusus pada 'cangkang login'. Ini akan melakukan yang khusus, setelah pengaturan sesi. Bash memperluas ini agak untuk melihat. Bash_profile terlebih dahulu sebelum. Profil, cara ini Anda bisa meletakkan bash hanya hal-hal di sana (sehingga mereka tidak mengacaukan Bourne shell, dll, yang juga melihat. Profil). Kerang lain, non-login, hanya akan sumber file rc, .bashrc (atau .kshrc, dll).

Ini sedikit anakronisme sekarang. Anda tidak login ke shell utama sebanyak Anda login ke window manager 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 isi .bash_profile harus:

[ -f $HOME/.bashrc ] && . $HOME/.bashrc

Dan letakkan semua yang benar-benar ingin Anda atur .bashrc

Ingat bahwa .bashrc bersumber untuk semua shell, interaktif dan non-interaktif. Anda dapat melakukan hubungan singkat pada sourcing untuk shell non-interaktif dengan menempatkan kode ini di dekat bagian atas .bashrc:

[[ $- != *i* ]] && return


34
2017-09-02 18:10



Ini ide yang buruk, lihat Jawabanku. Secara khusus, variabel lingkungan Anda hanya akan diatur dalam program yang diluncurkan melalui terminal, bukan dalam program yang dimulai langsung dengan ikon atau menu atau pintasan keyboard. - Gilles
@Gilles Saya tidak mengerti mengapa Anda mengklaim ini. Dengan .$HOME/.bashrc seperti yang ditunjukkan Rich di atas, pengaturan di .bashrc akan tersedia di shell login, dan dengan demikian lingkungan desktop juga. Misalnya, pada sistem Fedora saya, gnome-session dimulai sebagai -$SHELL -c gnome-session, jadi .profile adalah membaca. - Mikel
@PiotrDobrogost Oh, ya, ada masalah lain dengan jawaban Rich. Termasuk .bashrc di .profile biasanya tidak berfungsi, karena .profile dapat dieksekusi oleh /bin/sh dan bukan bash (misalnya di Ubuntu untuk login grafis secara default), dan shell itu mungkin tidak interaktif (misalnya untuk login grafis). - Gilles
@Gilles re: "termasuk .bashrc in .profile" sama sekali tidak direkomendasikan (justru sebaliknya). Jawabannya sudah diedit (tidak muncul begitu), atau komentar Anda tidak selaras dengan apa yang dikatakan. - michael
Secara umum, +1, tapi saya akan menambahkan rekomendasi untuk "korsleting ... untuk shell non-interaktif" ("di dekat bagian atas .bashrc: [[ $- != *i* ]] && return"); Saya suka beberapa dari saya .bashrc akan dieksekusi bahkan untuk shell non-interaktif, khususnya untuk mengatur env vars, ketika menerbitkan ssh hostname {command}, sehingga perintah remote dijalankan dengan benar (meskipun shell non-interaktif). Tetapi pengaturan lain di kemudian hari .bashrc harus diabaikan. Saya biasanya memeriksa TERM = bodoh dan / atau tidak disetel, dan kemudian menyelamatkannya lebih awal. - michael


Lihatlah ini posting blog yang sangat baik oleh ShreevatsaR. Ini 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. Executes A, lalu B, lalu C, dll. B1, B2, B3 berarti mengeksekusi hanya 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      |           |      |
+----------------+-----------+-----------+------+

14
2017-07-13 08:53



Daripada memposting jawaban yang sama pada banyak pertanyaan, lebih disukai jika Anda dapat menyesuaikan jawaban Anda dengan kebutuhan khusus dari penanya. Jika jawabannya persis sama untuk kedua pertanyaan, maka Anda harus memposting satu jawaban dan memilih untuk menutup pertanyaan lain sebagai duplikat dari yang asli. - Mokubai♦
@Mokubai Pertanyaan lain telah ditandai sebagai duplikat dari yang satu ini. - Flimm
@ElipticalView: dengan setel untuk tidak melakukan apa pun, Anda mengacu pada baris: [ -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 seharusnya berarti saya harus mengubah meja. - Flimm


KOMENTAR LEBIH BAIK UNTUK KEPALA / ETC / PROFIL

Berdasarkan jawaban hebat Flimmim di atas, saya menyisipkan komentar baru ini di kepala Debian / etc / profile 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 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 / etc / profile Debian oleh sumber default (termasuk) /etc/bash.bashrc (saat itulah /etc/bash.bashrc ada). Jadi skrip login membaca kedua file / etc, sementara non-login hanya berbunyi bash.bashrc.

Juga perlu dicatat bahwa /etc/bash.bashrc diatur untuk tidak melakukan apa-apa ketika tidak dijalankan secara interaktif. Jadi kedua file ini hanya untuk skrip interaktif.


3
2017-10-18 18:13