~ / .Bash_profile dosyam neden çalışmıyor?


35

Linux Mint kullanıyorum. Giriş kabuğum ( cat /etc/passwd | grep myUserName) bash.

Grafik masaüstü ortamımı başlattıktan ve ondan bir terminal emülatörü çalıştırdıktan sonra, .bash_profilebunun kaynak olmadığını görebiliyorum (içinde var olan ortam değişkendir export). Ancak bir metin konsolundan ( ctrl+ alt+ F1) giriş yaparsam veya bash -lterminal emülatöründen el ile çalıştırsam , .bash_profileiyi çalışır.

.bash_profileX başladığında kaynaklanmalı exportve terminaldeki tüm X değişkenlerinden mevcut olması gerektiğini düşündüğümde yanlış mıyım ?

PS Herşeyi yerleştirmek .bashrcve bu kaynaklardan almak .bash_profileiyi bir fikir değildir ( https://stackoverflow.com/questions/902946/ ): Ortam malzemesi yalnızca bir kez kaynaklanmalıdır.

Yanıtlar:


38

~/.bash_profileBir giriş kabuğu olduğunda dosya bash ile okunur. Metin modundayken giriş yaptığınız şey budur.

X altında oturum açtığınızda, başlangıç ​​komut dosyaları tarafından yürütülür /bin/sh. Ubuntu ve Mint günü /bin/sholan çizgi , olmasın, kabuk. Hem çizgi hem de bash aynı temel özelliklere sahiptir, ancak bu hızlı ve küçük olması için çizgi, bu çekirdek özelliklere yapışır, bash ise daha fazla kaynak gerektiren maliyetle çok fazla özellik ekler. Etkileşimli kullanım için ekstra özelliklere ve bash'a gerek duymayan scriptler için kısa çizgi kullanmak yaygındır ( zsh çok daha hoş özelliklere sahip olsa da ).

Görüntü yöneticisi çoğu kombinasyonları okuyup masaüstü ortamı (eğer kullanıcı adı ve parola yazın programı) ~/.profileiçinde giriş komut dosyalarından /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsessionveya hangisi geçerlidir. Yani ortam değişken değişken tanımlarını içine yerleştirin ~/.profile. Yalnızca dash'in desteklediği sözdizimini kullandığınızdan emin olun.

Öyleyse nereye ne koymalısın?

  • İyi bir .bash_profileyük .profileve .bashrckabuk etkileşimli ise yükler .

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
  • In .profile, ortam değişkeni tanımlarını ve diğer oturum ayarlarını koyun ulimit.

  • İçinde .bashrc, takma adlar, işlevler, tamamlama, tuş bağlamaları (içinde olmayan .inputrc),

Ayrıca bkz. Login Shell ve Login olmayan Shell? ve .bashrc Alternatif .


tek bir cevaptan öğrenilen pek çok şey :)
mtk

16

.bash_profilebash'ın başlangıç ​​yapılandırma betiğidir. X'i kaynağa zorunlu kılan standart bir standart yoktur .bash_profile.

Düşündüğün şey daha çok .profile. Başlangıçta, bourne kabuğunun (sh) başlangıç ​​yapılandırma dosyasıydı. Günümüzde birçok dağıtım masaüstü ortamını kaynağa ayarlamıştır .profile. Bunun bir standart olmadığını, ancak bunun bir kural gibi göründüğünü unutmayın.

Debian .profile, grafiksel girişlerde kaynak kullanıyordu ( 2013 itibariyle wiki sayfası ) şimdi değil ( 2016 itibariyle wiki sayfası ).

.xprofileGrafik girişindeki kaynakları arşivleyin (2013 itibariyle wiki sayfası ).

Ubuntu kullanarak vazgeçirmek için kullanılan .profile( 2013 itibariyle wiki sayfasını ) şimdi (artık vazgeçirmek değil 2016 itibariyle wiki sayfasını ).


Diğer sorunuzla ilgili olarak: Neden ~ / .bash_profile'im çalışmıyor? Beklenen davranış budur.

Kısacası, davranış şu şekildedir:

  • bash etkileşimli bir giriş kabuğu olarak başladı: okur ~/.profile
  • bash etkileşimli bir giriş olmayan kabuk olarak başladı: okur ~/.bashrc

Daha fazla ayrıntı için askubuntu'daki benzer bir soruya cevabımı görün: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc / 132319 # 132319


1
Bunlardan bazıları doğru, ancak “her zaman okundu ~/.bashrc” kötü bir öneri: yalnızca .bashrcetkileşimli bir kabuktan okumalısınız . Buradaki temel sorunu özlediniz, X altında giriş yaparken, bash giriş örneği yoktur (açıkça AntonioK'lar da dahil olmak üzere çoğu ekran yöneticisi / masaüstü ortamı birleşimi altında).
Gilles 'SO- kötülük yapmayı bırak' 22

Geri bildiriminiz için teşekkür ederiz. Umarım şikayetlerinizi çözecek kadar cevabımı yeterince güncellemişimdir. "Her zaman okuma .bashrc" tavsiyeme gelince , her zaman etkileşimli bir kabuk istemiştim. Bu kısmı açıklığa kavuşturdum. Umarım artık yanıltıcı değildir.
lesmana

2
Ubuntu özellikle .profile( link ) 'i kullanmaktan vazgeçer ” Wiki bir kere (saçma) bunu caydırır; bu düzeltildi. (Not /etc/profile, sistem genelindeki ödevler için, komut dosyalarına ekleme tercihinde bulunmaz /etc/profile.d.) Kullanıcı başına .profiledosyalar şimdi kullanıcı başına ortam değişkenlerini ayarlamanın önerilen yollarından biri olarak sunulur: "Yalnızca, yalnızca bir ortamı etkilemesi gereken ortam değişken ayarları için uygun dosyalar belirli bir kullanıcı (bir bütün olarak sistem yerine) ~ / .pam_environment ve ~ / .profile . "
Eliah Kagan

Debian olmadığını Debian belirtiyorsa hakkında bağlantılı sayfa değil okumak ~/.profilegrafik giriş için ve ~/.xsessionrcbunun yerine kullanılmalıdır.
karora

fark ettiğiniz için teşekkürler. wiki sayfası güncellendi. Cevap zamanında olduğu gibi sürümleriyle bağlantı kurdum.
lesmana,

2

/ Source ~ / .profile dosyasını yeniden yüklemeye çalışırken birkaç sorun ortaya çıkıyor. [Bu, Ubuntu linux’a atıfta bulunur - bazı durumlarda komutların detayları farklı olacaktır]

  1. Bunu doğrudan terminalde veya bir komut dosyasında mı çalıştırıyorsunuz?
  2. Bunu bir komut dosyasında nasıl çalıştırırsınız?

Ad. 1)

Bunu doğrudan terminalde çalıştırmak, hiçbir alt kabuk oluşmayacağı anlamına gelir. Böylece iki komutu da kullanabilirsiniz:

source ~/.bash_profile

veya

. ~/.bash_profile

Her iki durumda da, bu ortam .profile dosyasının içeriğiyle güncellenir.

Reklam 2) Herhangi bir bash betiğini ya arayarak başlatabilirsiniz.

sh myscript.sh 

veya

. myscript.sh

İlk durumda bu, sisteminizin ortam değişkenlerini etkilemeyecek bir alt kabuk yaratacaktır ve yalnızca alt kabuk işleminde görülebilir. Subshell komutunu bitirdikten sonra hiçbiri ihracat vb. Uygulanmayacaktır. BU BİR ORTAK HATIRDIR ve BİR ZAMAN KAYBETMEK İÇİN BİR GELİŞTİRİCİ OLDUĞUNDAN.

Komut dosyanızda uygulanan değişikliklerin global ortam üzerinde etkili olabilmesi için komut dosyasının birlikte çalışması gerekir.

.myscript.sh

Komut.

Komut dizinizin bir alt kabukta çalıştırılmadığından emin olmak için bu işlevi kullanabilirsiniz. (Yine örnek Ubuntu kabuğu içindir)

#/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
}

Umarım bu bazı yanlış anlaşılmaları temizler! : D İyi Şanslar!


1

Sorunuzda , kabul edilen cevap için reçete yazdığı zaman , kaynak yapmamanızı tavsiye eden https://stackoverflow.com/questions/902946/ adresine bakın .

  • PATH kurulumumu bir .profile dosyasına koyun (çünkü bazen diğer kabukları kullanıyorum)
  • Bash takma adlarımı ve işlevlerimi .bashrc dosyama ekle
  • Sonra bunu kullanın [EDITED: snip code-comments]:

    .bash_profile:

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

Hepsini koymak .profilebenim için Linux Mint'te işe yaramadı. Kullanarak iyi .bashrcçalıştı.


0

Basit çözüm, terminali bir giriş terminali yapmaktır. Varsayılan profilin 'Döşeme ve Komutu' altındaki Gnome terminali için "Komutu bir giriş kabuğu olarak çalıştır" kutusunu işaretleyebilirsiniz. Bu makale bir giriş kabuğu ile olmayan bir farkı açıklar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.