Mengapa ~ / .bash_profile saya tidak berfungsi?

35

Saya menggunakan Linux Mint. Shell login saya ( cat /etc/passwd | grep myUserName) adalah bash.

Setelah saya memulai lingkungan desktop grafis saya dan menjalankan emulator terminal darinya, saya dapat melihat bahwa .bash_profileitu tidak bersumber (vars lingkungan yang diedit exportdi dalamnya tidak disetel). Tetapi jika saya masuk dari konsol teks ( ctrl+ alt+ F1) atau dijalankan secara manual bash -ldari terminal emulator, .bash_profileberfungsi dengan baik.

Apakah saya salah ketika saya berpikir bahwa .bash_profileseharusnya bersumber ketika X mulai dan semua exportvars harus tersedia di terminal, berjalan dari X?

PS Menempatkan segala sesuatu di dalam .bashrcdan sumbernya dari .bash_profileitu bukan ide yang baik ( https://stackoverflow.com/questions/902946/ ): hal-hal lingkungan harus bersumber hanya sekali.

AntonioK
sumber

Jawaban:

39

File ~/.bash_profiledibaca oleh bash ketika itu adalah shell login. Itu yang Anda dapatkan saat masuk dalam mode teks.

Saat Anda masuk di bawah X, skrip startup dijalankan oleh /bin/sh. Di Ubuntu dan Mint, /bin/shadalah tanda hubung , bukan bash. Dash dan bash keduanya memiliki fitur inti yang sama, tetapi dasbor menempel pada fitur inti ini agar cepat dan kecil sedangkan bash menambahkan banyak fitur dengan biaya yang membutuhkan lebih banyak sumber daya. Adalah umum untuk menggunakan tanda hubung untuk skrip yang tidak memerlukan fitur tambahan dan bash untuk penggunaan interaktif (meskipun zsh memiliki banyak fitur yang lebih bagus ).

Sebagian kombinasi display manager (program di mana Anda mengetik nama pengguna dan password) dan lingkungan desktop membaca ~/.profiledari skrip login di /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsessionatau mana yang berlaku. Jadi masukkan definisi variabel lingkungan Anda ~/.profile. Pastikan hanya menggunakan sintaks yang didukung dasbor.

Jadi apa yang harus Anda taruh di mana?

  • Sebuah baik .bash_profilebeban .profile, dan beban .bashrcjika shell interaktif.

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
  • Di .profile, masukkan definisi variabel lingkungan, dan pengaturan sesi lainnya seperti ulimit.

  • Di dalam .bashrc, masukkan pengaturan interaktif bash seperti alias, fungsi, penyelesaian, ikatan utama (yang tidak ada dalam .inputrc), ...

Lihat juga Perbedaan antara Shell Login dan Shell Non-Login? dan Alternatif untuk .bashrc .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
banyak hal yang dipelajari dari satu jawaban :)
mtk
16

.bash_profileadalah skrip konfigurasi startup dari bash. Tidak ada standar yang mewajibkan X untuk sumber .bash_profile.

Apa yang Anda pikirkan lebih tepatnya .profile. Awalnya itu adalah file konfigurasi startup dari bourne shell (sh). Saat ini banyak distribusi yang mengatur lingkungan desktop mereka ke sumber .profile. Perhatikan bahwa ini juga bukan standar, tetapi tampaknya menjadi sebuah konvensi.

Debian digunakan untuk sumber .profilepada login grafis ( halaman wiki pada 2013 ) sekarang tidak ( halaman wiki pada 2016 ).

Sumber-sumber lengkung .xprofilepada login grafis ( halaman wiki pada 2013 ).

Ubuntu digunakan untuk mencegah penggunaan .profile( halaman wiki pada 2013 ) sekarang tidak mencegah lagi ( halaman wiki pada 2016 ).


Mengenai pertanyaan Anda yang lain: Mengapa ~ / .bash_profile saya tidak berfungsi? Itulah perilaku yang diharapkan.

Singkatnya, perilaku tersebut adalah sebagai berikut:

  • bash dimulai sebagai shell login interaktif: terbaca ~/.profile
  • bash dimulai sebagai shell non-login interaktif: baca ~/.bashrc

Untuk lebih jelasnya lihat jawaban saya untuk pertanyaan serupa di askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc / 132319 # 132319

lesmana
sumber
1
Beberapa di antaranya benar, tetapi "selalu membaca ~/.bashrc" adalah saran yang buruk: Anda hanya.bashrc boleh membaca dari shell interaktif . Anda telah melewatkan masalah inti di sini yaitu ketika masuk di bawah X, tidak ada instance login dari bash (di sebagian besar tampilan manajer / kombinasi lingkungan desktop, termasuk yang jelas milik AntonioK).
Gilles 'SANGAT berhenti menjadi jahat'
Terima kasih atas tanggapan Anda. Saya harap saya memperbarui jawaban saya dengan cukup baik untuk menyelesaikan keluhan Anda. Mengenai saran saya untuk "selalu membaca .bashrc", saya selalu bermaksud untuk shell interaktif. Saya sudah mengklarifikasi bagian itu. Saya harap ini tidak menyesatkan lagi.
lesmana
2
" Ubuntu secara khusus tidak mendukung penggunaan .profile( tautan ) " Wiki itu pernah (secara tidak masuk akal) mengecilkan hal itu; itu sudah diperbaiki. (Catatan /etc/profiletetap tidak disarankan untuk penugasan di seluruh sistem, dalam preferensi untuk menambahkan skrip ke /etc/profile.d.) .profileFile per pengguna sekarang disajikan sebagai salah satu cara yang disarankan untuk mengatur variabel lingkungan per-pengguna: "File yang cocok untuk pengaturan variabel lingkungan yang harus memengaruhi hanya pengguna tertentu (bukan sistem secara keseluruhan) adalah ~ / .pam_environment dan ~ / .profile . "
Eliah Kagan
Halaman tertaut tentang Debian menentukan bahwa Debian tidak membaca ~/.profileuntuk login grafis dan ~/.xsessionrcharus digunakan sebagai gantinya.
karora
terima kasih telah memperhatikan. halaman wiki diperbarui. saya ditautkan ke versi karena mereka pada saat menjawab.
lesmana
2

Dalam pertanyaan Anda, Anda merujuk ke https://stackoverflow.com/questions/902946/ sebagai merekomendasikan untuk tidak sumber, ketika jawaban yang diterima mengatur untuk

  • Masukkan pengaturan PATH saya ke dalam file .profile (karena saya terkadang menggunakan shell lain)
  • Masukkan alias dan fungsi Bash saya ke dalam file .bashrc saya
  • Kemudian gunakan ini [EDITED: snip code-comments]:

    .bash_profile:

    #!/bin/bash
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # Get the paths
    source ~/.bashrc  # get aliases

Memasukkan semuanya .profiletidak bekerja untuk saya di Linux Mint. Menggunakan .bashrcbekerja dengan baik.

serv-inc
sumber
2

Beberapa masalah muncul ketika mencoba memuat ulang / source ~ / .profile file. [Ini merujuk ke Ubuntu linux - dalam beberapa kasus detail dari perintah akan berbeda]

  1. Apakah Anda menjalankan ini langsung di terminal atau dalam skrip?
  2. Bagaimana Anda menjalankan ini dalam skrip?

Iklan. 1)

Menjalankan ini secara langsung di terminal berarti bahwa tidak akan ada subkulit yang dibuat. Jadi, Anda dapat menggunakan dua perintah:

source ~/.bash_profile

atau

. ~/.bash_profile

Dalam kedua kasus ini akan memperbarui lingkungan dengan isi file profil.

Iklan 2) Anda dapat memulai skrip bash apa pun dengan menelepon

sh myscript.sh 

atau

. myscript.sh

Dalam kasus pertama ini akan membuat subkulit yang tidak akan memengaruhi variabel lingkungan sistem Anda dan hanya akan terlihat pada proses subkulit. Setelah menyelesaikan perintah subkulit, tidak ada ekspor dll yang akan diterapkan. INI ADALAH KESALAHAN UMUM DAN MENYEBABKAN BANYAK PENGEMBANG UNTUK MENURUNKAN BANYAK WAKTU.

Agar perubahan yang diterapkan dalam skrip Anda memiliki efek untuk lingkungan global, skrip harus dijalankan

.myscript.sh

perintah.

Untuk memastikan bahwa skrip Anda tidak dijalankan di subshel, Anda dapat menggunakan fungsi ini. (Sekali lagi contoh untuk shell Ubuntu)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

Saya harap ini menghapus beberapa kesalahpahaman umum! : D Semoga Sukses!

twboc
sumber
0

Solusi sederhananya adalah menjadikan terminal sebagai terminal login. Untuk terminal Gnome di bawah 'Tile and Command' dari profil default Anda dapat mencentang kotak "Run command as a shell login". Artikel ini menjelaskan perbedaan antara shell login dan yang tidak.

program drifting
sumber