Apa perbedaan antara .bashrc, .bash_profile, dan .environment?

130

Saya telah menggunakan sejumlah sistem berbasis * nix yang berbeda tahun ini, dan sepertinya setiap cita rasa Bash yang saya gunakan memiliki algoritma yang berbeda untuk memutuskan skrip startup mana yang akan dijalankan. Untuk keperluan tugas-tugas seperti mengatur variabel dan alias lingkungan dan mencetak pesan startup (mis. MOTD), skrip startup mana yang tepat untuk melakukan ini?

Apa perbedaan antara menempatkan hal-hal dalam .bashrc, .bash_profiledan .environment? Saya juga melihat file lain seperti .login, .bash_login, dan .profile; apakah ini pernah relevan? Apa perbedaan yang dijalankan ketika masuk secara fisik, masuk jarak jauh melalui ssh, dan membuka jendela terminal baru? Apakah ada perbedaan signifikan di seluruh platform (termasuk Mac OS X (dan Terminal.app-nya) dan Cygwin Bash)?

Adam Rosenfield
sumber

Jawaban:

73

Perbedaan utama dengan file konfigurasi shell adalah beberapa hanya dapat dibaca oleh shell "login" (mis. Ketika Anda login dari host lain, atau login di konsol teks dari mesin unix lokal). ini adalah yang disebut, katakan, .loginatau .profileatau .zlogin(tergantung pada shell yang Anda gunakan).

Kemudian Anda memiliki file konfigurasi yang dibaca oleh shell "interaktif" (seperti pada, yang terhubung ke terminal (atau pseudo-terminal dalam kasus, katakanlah, terminal emulator berjalan di bawah sistem windowing). Ini adalah yang dengan nama seperti .bashrc, .tcshrc, .zshrc, dll

bashmempersulit ini yang .bashrcadalah hanya dibaca oleh shell yang baik interaktif dan non-login , sehingga Anda akan menemukan kebanyakan orang akhirnya mengatakan mereka .bash_profilejuga membaca .bashrcdengan sesuatu seperti

[[ -r ~/.bashrc ]] && . ~/.bashrc

Shell lain berperilaku berbeda - misalnya dengan zsh, .zshrcselalu dibaca untuk shell interaktif, apakah itu login atau tidak.

Halaman manual untuk bash menjelaskan keadaan di mana setiap file dibaca. Ya, perilaku umumnya konsisten di antara mesin.

.profilehanyalah nama file skrip login yang awalnya digunakan oleh /bin/sh. bash, yang umumnya kompatibel dengan mundur /bin/sh, akan membaca .profilejika ada.

Cos
sumber
48

Sederhana saja. Dijelaskan dalam man bash:

/bin/bash
       The bash executable
/etc/profile
       The systemwide initialization file, executed for login shells
~/.bash_profile
       The personal initialization file, executed for login shells
~/.bashrc
       The individual per-interactive-shell startup file
~/.bash_logout
       The individual login shell cleanup file, executed when a login shell exits
~/.inputrc
       Individual readline initialization file

Shell login adalah yang dibaca ketika Anda login (jadi, mereka tidak dieksekusi ketika hanya menjalankan xterm, misalnya). Ada cara lain untuk masuk. Misalnya menggunakan manajer tampilan X. Mereka memiliki cara lain untuk membaca dan mengekspor variabel lingkungan pada saat login.

Baca juga INVOCATIONbab dalam manual. Dikatakan "Paragraf berikut menjelaskan bagaimana bash mengeksekusi file startup-nya." , saya pikir itu tepat :) Ini menjelaskan apa shell "interaktif" juga.

Bash tidak tahu .environment. Saya menduga itu adalah file distribusi Anda, untuk mengatur variabel lingkungan independen dari shell yang Anda kendarai.

Johannes Schaub - litb
sumber
1
Bisakah Anda menambahkan /etc/bashrcuntuk memenuhi jawabannya?
Nemoden
9

Klasik, ~/.profiledigunakan oleh Bourne Shell, dan mungkin didukung oleh Bash sebagai ukuran warisan. Sekali lagi, ~/.logindan ~/.cshrcdigunakan oleh C Shell - Saya tidak yakin Bash menggunakannya sama sekali.

Ini ~/.bash_profileakan digunakan sekali, saat login. The ~/.bashrcScript adalah membaca setiap kali shell dimulai. Ini analog dengan /.cshrcuntuk C Shell.

Salah satu konsekuensinya adalah bahwa barang-barang di ~/.bashrcharus sekecil mungkin untuk mengurangi overhead ketika memulai shell non-login.

Saya percaya ~/.environmentfile tersebut adalah file kompatibilitas untuk Korn Shell.

Jonathan Leffler
sumber
7

Saya menemukan informasi tentang .bashrc dan .bash_profile di sini untuk meringkasnya:

.bash_profile dijalankan ketika Anda login. Barang yang Anda masukkan mungkin ada PATH Anda dan variabel lingkungan penting lainnya.

.bashrc digunakan untuk shell yang tidak masuk. Saya tidak yakin apa artinya itu. Saya tahu bahwa RedHat mengeksekusinya setiap kali Anda memulai shell lain (su untuk pengguna ini atau cukup memanggil bash lagi) Anda mungkin ingin memasukkan alias di sana tetapi sekali lagi saya tidak yakin apa artinya itu. Saya mengabaikannya sendiri.

.profile sama dengan .bash_profile untuk root. Saya pikir namanya diubah untuk membiarkan cangkang lain (csh, sh, tcsh) menggunakannya juga. (Anda tidak memerlukannya sebagai pengguna)

Ada juga .bash_logout yang dijalankan pada, ya tebakan bagus ... logout. Anda mungkin ingin menghentikan para diaken atau bahkan membuat rumah kecil. Anda juga dapat menambahkan "hapus" di sana jika Anda ingin menghapus layar saat Anda keluar.

Juga ada tindak lanjut lengkap pada masing-masing file konfigurasi di sini

Ini mungkin bahkan tergantung pada distro, tidak semua distro memilih untuk memiliki setiap konfigurasi dengan mereka dan beberapa bahkan lebih. Tetapi ketika mereka memiliki nama yang sama, mereka biasanya memasukkan konten yang sama.

Filip Ekberg
sumber
4

Menurut Josh Staiger , Terminal.app Mac OS X sebenarnya menjalankan shell login daripada shell non-login secara default untuk setiap jendela terminal baru, memanggil .bash_profile alih-alih .bashrc.

Dia merekomendasikan:

Sebagian besar waktu Anda tidak ingin mempertahankan dua file konfigurasi terpisah untuk shell login dan non-login - ketika Anda mengatur PATH, Anda ingin itu berlaku untuk keduanya. Anda dapat memperbaikinya dengan sumber .bashrc dari file .bash_profile Anda, lalu masukkan PATH dan pengaturan umum di .bashrc.

Untuk melakukan ini, tambahkan baris berikut ke .bash_profile:

if [ -f ~/.bashrc ]; then 
    source ~/.bashrc 
fi

Sekarang ketika Anda masuk ke mesin Anda dari konsol .bashrc akan dipanggil.

Rose Perrone
sumber
2

Tempat yang bagus untuk melihat adalah halaman manual bash. Ini versi online. Cari bagian "INVOKASI".

PolyThinker
sumber
0

Saya telah menggunakan distro Debian-family yang tampaknya mengeksekusi .profile, tetapi tidak .bash_profile, sedangkan turunan RHEL mengeksekusi .bash_profilesebelumnya .profile.

Tampaknya berantakan ketika Anda harus mengatur variabel lingkungan untuk bekerja di OS Linux apa pun.

seismick
sumber