Apa perbedaan antara .bash_profile dan .bashrc?

241

Untuk membuat alias untuk Terminal di OS X, Anda dapat memasukkan alias di .bash_profileatau .bashrc. Apa perbedaan antara keduanya dan mengapa saya memilih untuk menempatkan alias di satu dan bukan yang lain?

daviesgeek
sumber
5
Bukan untuk mencegah pengetahuan unix di sini, tetapi bash adalah binatang UNIX murni sehingga Anda mungkin mendapatkan pengetahuan yang lebih baik atau pertanyaan ini dijawab beberapa kali di situs mitra. Ada lebih dari 200 pasangan bashrc tanya / jawab di unix
bmike
Ada. Profil juga ... Lihat pertanyaan ini di Stack Overflow.
Yaakov Baruch
2
Jika Anda brew install bashdan menggunakan iTerm2, Anda bisa mengatur profile -> commanduntuk /usr/local/bin/bashyang akan memuat .bashrcsecara default setelah .bash_profile. Ini juga memberi Anda barang Bash 4 ...
Ray Foss
Saya mendengar .bashrc tidak digunakan selama bertahun-tahun, dan secara default tidak akan berfungsi, dan .bash_profile adalah hal di macosx. Dan saya mencoba .bashrc dan t tidak bekerja untuk saya tetapi .bash_profile berhasil
barlop

Jawaban:

240

.bash_profiledieksekusi untuk shell login, sementara .bashrcdieksekusi untuk shell non-login interaktif.

Saat Anda masuk (ketikkan nama pengguna dan kata sandi) melalui konsol, baik duduk di mesin, atau dari jarak jauh melalui ssh: .bash_profiledijalankan untuk mengkonfigurasi shell Anda sebelum prompt perintah awal.

Tetapi, jika Anda sudah masuk ke mesin Anda dan membuka jendela terminal baru (xterm) maka .bashrcdieksekusi sebelum jendela command prompt. .bashrcjuga dijalankan ketika Anda memulai instance bash baru dengan mengetikkan /bin/bashterminal.

Pada OS X, Terminal secara default menjalankan shell login setiap waktu, jadi ini sedikit berbeda dengan kebanyakan sistem lain, tetapi Anda dapat mengonfigurasinya dalam preferensi.

Alex
sumber
57
On OS X, Terminal by default runs a login shell every time- Saya selalu bingung dengan tidak menyadarinya. Info bagus!
vaughan
1
@Alex, Mengapa terminal OS X menjalankan shell login setiap waktu?
Pacerier
17
Karena beberapa pengembang Apple tidak menyadari perbedaan awalnya dan sekarang diabadikan dalam beberapa omong kosong.
Snowcrash
2
Saya menggunakan OS X dan saya menggunakan zshell bukan bash, dan iTerm bukan Terminal. Terlepas dari kenyataan bahwa saya menggunakan terminal yang berbeda dan shell yang berbeda dari jawaban yang dibahas, OS X tampaknya masih mempertimbangkan semuanya sebagai shell login, karena .zprofiledijalankan setiap saat.
Adam Zerner
1
Bagi mereka yang mencari penjelasan menyeluruh tentang kombinasi shell login / non-login dan interaktif / non-interaktif dan ketika mereka menjalankan file konfigurasi ini, lihat unix.stackexchange.com/a/46856/38715
kevinmicke
43

X11 akan melihat Anda .bashrcsementara Terminal "biasa" akan melihatnya.bash_profile

Namun, jika Anda menambahkan berikut ini ke Anda .bash_profile, Anda kemudian dapat memindahkan semuanya ke dalam .bashrcfile Anda untuk menggabungkan semuanya menjadi satu tempat, bukan dua:

if [ -f $HOME/.bashrc ]; then
        source $HOME/.bashrc
fi
Kecenderungan
sumber
Atau Anda bisa melakukannya cd ~ ; ln -s .bashrc .bash_profile.
lhf
5
2 file konfigurasi ini memiliki fungsi yang jelas terpisah. Dalam beberapa kasus, perlu memiliki hal-hal untuk diinisialisasi pada awal sesi dan hanya di sana ( ~/.bash_profile). Hal ini juga sering diperlukan untuk memiliki hal-hal untuk mendefinisikan incrementaly di setiap level shell ( ~/.bashrc). Bukan ide terbaik untuk menyarankan untuk menekan kebebasan ini.
dan
3
@danielAzuelos: Lurch membiarkan bagian ini keluar, tetapi Terminal OS X sumber ~/.bash_profileuntuk setiap jendela / tab baru, jadi tidak ada cara untuk memisahkan keduanya sejauh menyangkut Terminal.
mipadi
14
@mipadi Masih ada nilai untuk memisahkan mereka. Misalnya, .bash_profiletidak pernah bisa bersumber lagi dalam proses anak. Setiap tingkat sumber Bash bersarang .bashrc, jadi jika Anda meletakkan sesuatu seperti export A=a:$Adi .bashrc, Anda $Aakan mendapatkan lagi di Bash bersarang. Saya biasanya meninggalkan variabel lingkungan di profil, dan alias di RC.
Franklin Yu
@ FranklinYu Mungkin bukan masalah besar bagi banyak orang, tapi saya sepenuhnya setuju! Ini adalah poin teknis yang bagus untuk mengingatkan orang dan layak mendapatkan lebih banyak upvotes.
Subfuzion
22

Untuk macOS, kode yang harus dimasukkan .bash_profileuntuk menggabungkan semuanya .bashrcadalah sebagai berikut:

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

Ini lebih spesifik untuk pengguna terminal Mac.

frzhen
sumber
4
Meskipun benar, bagaimana ini berbeda dari jawaban Lurch dari 2012 ?
Arjan
0

TLDR; gunakan .bash_profileuntuk alias Anda.

Cara berbagai file inisialisasi bekerja sama sedikit lebih rumit, dan ada beberapa kasus khusus yang penting di OSX. Berikut adalah hal-hal menariknya:

  • Bash, pada platform apa pun, mengeksekusi salah satu dari beberapa file berbeda bergantung pada bagaimana itu dipanggil. Detailnya ada di sini .
  • Aplikasi Terminal OSX melakukan sesuatu yang tidak standar: ia membuat setiap tab atau jendela baru seolah-olah itu adalah shell login, yang berarti itu .bash_profiledisebut. Demikian saran TLDR di atas.
  • .bashrcjuga merupakan opsi, tetapi itu akan dipanggil setiap kali Anda membuat subkulit (yaitu, panggil bash), yang dapat membuat inefisiensi jika Anda memperbarui variabel di dalamnya (misalnya, PATH=/bin/foo:$PATH)
  • Aplikasi lain yang memiliki terminal tertanam dapat memilih untuk mengikuti konvensi Terminal App atau tidak. Khususnya, Visual Studio Code, secara default, tidak .
  • Aplikasi yang dipanggil melalui GUI tidak dihasilkan dari shell. Dengan demikian, ada beberapa mekanisme yang bersaing untuk menetapkan variabel lingkungan agar mereka lihat, yang telah berubah selama bertahun-tahun .
  • Cuplikan yang memanggil .bashrcdari .bash_profilecukup umum. Saya tidak merekomendasikan itu, tetapi itu adalah preferensi.
Leo
sumber
Mengapa tepatnya menggunakan .bash_profilealias alias rumit? Item yang Anda daftarkan sebagian hanya tentang alias sama sekali, jadi alih-alih hanya membuat daftar beberapa peluru yang mungkin menjelaskan mengapa tampaknya rumit, bisakah Anda mengusulkan cara untuk membuatnya lebih mudah dalam batasan ini?
nohillside
Saya mengerti maksud Anda. Bukannya menggunakan .bash_profile rumit. Ini adalah cara file dipanggil rumit. Saya akan memperbarui.
Leo
Memanggil .bashrc dari .bash_profile direkomendasikan dalam manual bash GNU - jika tidak, bagaimana Anda mengatur variabel dll yang Anda perlukan baik dalam shell login dan yang non intereaktif?
Tandai
Setiap terminal emulator yang saya gunakan pada OS yang berbeda memiliki opsi untuk menjalankan windows baru sebagai shell login, xterm dan Xfce untuk menyebutkan hanya dua.
fd0