Mengapa ~ / .bash_profile tidak didapatkan saat membuka terminal?

175

Masalah

Saya memiliki Mesin Virtual Ubuntu 11.04 dan saya ingin mengatur lingkungan pengembangan Java saya. Saya melakukan sebagai berikut

  1. sudo apt-get install openjdk-6-jdk
  2. Menambahkan entri berikut ke ~ / .bash_profile

    export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    
    export PATH=$PATH:$JAVA_HOME/bin
  3. Simpan perubahan dan keluar

  4. Buka terminal lagi dan ketikkan yang berikut ini

    echo $JAVA_HOME   (blank)
    echo $PATH        (displayed, but not the JAVA_HOME value)
  5. Tidak ada yang terjadi, seperti jika ekspor JAVA_HOME dan penambahannya ke PATH tidak pernah dilakukan.

Larutan

Saya harus pergi ke ~ / .bashrc dan menambahkan entri berikut di akhir file

#Source bash_profile to set JAVA_HOME and add it to the PATH because for some reason is not being picked up
. ~/.bash_profile

Pertanyaan

  1. Mengapa saya harus melakukan itu? Saya pikir bash_profile, bash_login atau profil karena tidak ada dua yang dieksekusi terlebih dahulu sebelum bashrc.
  2. Apakah dalam kasus ini terminal saya shell non-login ?
  3. Jika demikian, mengapa ketika melakukan su setelah terminal dan meletakkan kata sandi itu tidak mengeksekusi profil di mana saya juga mengatur ekspor yang disebutkan di atas?
Viriato
sumber

Jawaban:

224

~/.bash_profilehanya bersumber dari bash ketika dimulai dalam mode login interaktif. Itu biasanya hanya ketika Anda masuk di konsol ( Ctrl+ Alt+ F1.. F6), atau menghubungkan melalui ssh.

Saat Anda masuk secara grafis, ~/.profileakan secara khusus bersumber dari skrip yang meluncurkan sesi gnome (atau lingkungan desktop mana pun yang Anda gunakan). Jadi ~/.bash_profiletidak bersumber sama sekali ketika Anda login secara grafis.

Ketika Anda membuka terminal, terminal memulai bash dalam mode interaktif (non-login), yang berarti terminal akan bersumber ~/.bashrc.

Tempat yang tepat bagi Anda untuk memasukkan variabel lingkungan ini ~/.profile, dan efeknya akan terlihat saat Anda masuk.

Sumber ~/.bash_profiledari ~/.bashrcadalah solusi yang salah. Seharusnya sebaliknya; ~/.bash_profileharus sumber ~/.bashrc.

Lihat DotFiles untuk penjelasan yang lebih menyeluruh, termasuk beberapa sejarah mengapa itu seperti itu.

(Di samping catatan, ketika menginstal openjdk melalui apt, symlink harus diatur oleh paket, sehingga Anda tidak benar-benar perlu mengatur JAVA_HOMEatau mengubah PATH)

geirha
sumber
6
Saya telah menemukan bahwa ketika membuka Terminal dari sidebar di Ubuntu 12 file ~ / .profile tidak dimuat.
jcollum
3
@ jcollum Itu bagus. .profileseharusnya hanya bersumber saat Anda masuk.
geirha
2
oh, membuka terminal tidak sama dengan masuk ... Saya berpikir untuk masuk ke terminal .
jcollum
2
Ingatlah bahwa .profilediabaikan oleh bash jika .bash_profileada. Lihat jawaban saya di sini dan man bashuntuk lebih jelasnya.
terdon
3
@terdon, ya, tapi bash tidak terlibat saat masuk secara grafis, jadi langsung saja .profile.
geirha
48

Anda dapat memeriksa apakah Bash shell Anda dimulai sebagai shell-login dengan menjalankan:

shopt login_shell

Jika jawabannya adalah offAnda tidak menjalankan shell login.

Baca bagian doa manual Bash tentang bagaimana Bash membaca (atau tidak membaca) file konfigurasi yang berbeda.

Kutipan dari man bash:

Ketika bash dipanggil sebagai shell login interaktif, atau sebagai shell non-interaktif dengan --login opsi, bash pertama kali membaca dan mengeksekusi perintah dari file /etc/profile, jika file itu ada. Setelah membaca file itu, tampaknya untuk ~/.bash_profile, ~/.bash_logindan ~/.profile, agar, dan membaca dan mengeksekusi perintah dari yang pertama yang ada dan dapat dibaca.

sudi sisi lain juga tidak memulai shell login secara default, Anda harus mengatakannya untuk melakukannya dengan menggunakan --loginopsi.

lgarzo
sumber
9
Terima kasih banyak untuk perintah login_shell shotp . Hebat !!
Viriato
27

Saya pikir perlu disebutkan bahwa Anda dapat mengubah default gnome-terminal untuk menggunakan shell login (mis. Bash -l) dengan mengedit preferensi profil.

pergi ke Edit -> Preferensi Profil -> tab Judul dan Perintah centang opsi "Jalankan perintah sebagai shell masuk"

Kisoku
sumber
1
Apa kerugian untuk mengaktifkan pengaturan ini?
chrish
2
@ Chris Anda hanya memuat kode sedikit lebih banyak kode daripada yang diperlukan dalam banyak kesempatan. Mungkin tidak masalah jika Anda ~/.bash_profilemengevaluasi dengan sangat cepat, yang mungkin memang demikian. Hal yang baik untuk diperiksa adalah mengusir semua panggilan ke proses lain yang biasanya cukup mahal.
vaab
14

Jika Anda membuka terminal atau menjalankan sushell tidak dieksekusi sebagai shell login tetapi sebagai shell interaktif normal. Jadi bunyinya ~/.bashrctapi tidak ~/.bash_profile. Anda dapat menjalankannya sudengan -lopsi untuk membuatnya menjalankan shell Anda sebagai shell login.

Ketika Anda bekerja dengan GUI, shell biasanya tidak pernah dijalankan sebagai shell login sehingga biasanya baik-baik saja untuk memasukkan semua barang Anda ~/.bashrc.

Florian Diesch
sumber
1
Itulah yang telah saya lakukan dan berhasil, tetapi periksa apa kata orang di bagian bawah, ia menyarankan adalah ide yang buruk untuk meletakkannya di bashrc dan meletakkannya di profil. .... Hei keduanya bekerja, terima kasih banyak.
Viriato
4

TL; DR

Dalam pengaturan ubuntu klasik yang direkomendasikan, ~/.bash_profileakan dievaluasi hanya pada kesempatan tertentu. Dan itu masuk akal.

Masukkan barang-barang Anda ~/.bashrc, itu akan dievaluasi setiap saat.

Ok, saya ingin mengerti, mengapa ini masuk akal?

Titik titik untuk memahami apa yang sedang terjadi:

  • semua proses di linux memiliki dan menggunakan variabel lingkungan
  • variabel lingkungan diwarisi
  • jadi mengaturnya sekali pada bapak dari semua proses Anda sudah cukup (terutama jika itu membutuhkan waktu komputasi.)
  • bapak dari semua proses Anda biasanya diluncurkan setelah Anda masuk di perangkat Anda (berikan kredensial Anda).
  • ada hal-hal yang Anda mungkin ingin lakukan hanya sekali ketika Anda masuk di komputer Anda (periksa surat baru misalnya ...).

Jadi waktu "masuk" biasanya:

  • Dalam mode konsol, ketika Anda masuk (dengan Ctrl-Alt F1) atau melalui ssh, karena shell akan menjadi bapak dari semua proses, itu akan memuat Anda ~/.bash_profile.
  • Dalam mode grafis, ketika Anda membuka sesi Anda, proses pertama ( gnome-sessionuntuk ubuntu klasik) akan bertanggung jawab untuk membaca
    .profile.

Ok, jadi kemana harus menaruh barang-barang saya?

Agak rumit, cerita lengkapnya ada di sini . Tapi di sini ada run down yang sangat umum untuk pengguna ubuntu. Jadi mempertimbangkan itu:

  • Anda menggunakan bashshell,
  • Anda memiliki ~/.bash_profiledan ikuti rekomendasi untuk menambahkan pemuatan ~/.bashrcdi Anda ~/.bash_profilesehingga untuk mendapatkan setidaknya satu file yang akan dievaluasi apa pun mecanisme doa .

Ini adalah saran cepat tempat meletakkan barang.

  • ~ / .bashrc (Mendapat evaluasi dalam semua kesempatan , asalkan Anda mengikuti rekomendasi)

    Untuk variabel dan kode lingkungan evaluasi cepat untuk penggunaan baris perintah khusus pengguna dan bash saja (alias misalnya). bashism dipersilakan.

    Itu dimuat sendiri pada:

    • membuat jendela / panel shell baru dalam sesi grafis.
    • panggilan bash
    • screenpanel atau tab baru. (tidak tmux!)
    • setiap contoh bash di klien konsol grafis ( terminator/ gnome-terminal...) jika Anda tidak mencentang opsi "jalankan perintah sebagai shell login".

    Dan itu akan dimuat di semua kesempatan lain berkat rekomendasi sebelumnya.

  • ~ / .bash_profile (Mendapat evaluasi hanya pada acara tertentu )

    Untuk variabel dan kode lingkungan evaluasi lambat untuk proses sesi khusus pengguna dan Anda saja . bashism dipersilakan. Itu dimuat pada:

    • login konsol (Ctrl-Alt F1),
    • ssh login ke mesin ini,
    • tmuxpanel atau jendela baru (pengaturan default), (tidak screen!)
    • panggilan eksplisit dari bash -l,
    • setiap contoh bash di klien konsol grafis ( terminator/ gnome-terminal...) hanya jika Anda mencentang opsi "jalankan perintah sebagai shell login".
  • ~ / .profile (Hanya dievaluasi dalam sesi grafis)

    Untuk variabel lingkungan evaluasi lambat dan tanpa larangan untuk pengguna Anda saja dan semua proses sesi grafis . Itu dimuat saat masuk di UI grafis Anda.

vaab
sumber
Jika bash memuat file profil, bash akan memuat .profilejika .bash_profiletidak ada.
muru
Terima kasih banyak atas penjelasan yang jelas. ini membantu pemula seperti saya. Di Mac Mojave, jika saya meletakkan variabel di ~ / .bashrc dan lakukan sumber, dan kemudian jika saya lakukan envsaya tidak melihat variabel env ditetapkan (saya mencoba menutup iTerm dan membuka kembali). Tapi saya perhatikan bahwa ketika saya menginstal Android studio dan aplikasi lain, semua vars itu sudah diatur /.bash_profile. Jadi ketika saya menambahkannya /.bash_profilebekerja seperti pesona. Mengapa demikian?
sofs1