.Bashrc, .profile, .bash_profile, etc arasında seçim yapma [duplicate]


197

Bu sorunun zaten burada bir cevabı var:

Bu utanç verici, ama bir kabuk özelleştirme gitmeli eğer POSIX sistemlerini tam zamanlı kullanmanın yıllar sonra, hala bulmaktan zor bir zaman .bashrc, .profilebaşka bir yerde veya. OS gibi bazı config dosyalarından bahsetmiyorum bile .pam_environment.

Evet, belgelerde nasıl yapılacağını biliyorum ve her dosyanın ne zaman yüklendiğini veya yüklenmediğini öğreniyorum. Merak ettiğim şey, herhangi birinin belirli bir özelleştirme türüne hangi dosyaya karar vereceğine dair kapsamlı yönergeler bir araya getirip getirmediği.


6
Bu soru, nedeni tekrarlanan olarak işaretlenmemelidir. Eklenen soruda .profile bulunmaz.
Premraj

Yanıtlar:


222

TL; DR:

  • ~/.bash_profilesüper basit olmalı ve sadece yüklemeli .profileve .bashrc(bu sırada)

  • ~/.profileortam değişkenleri ( PATHve arkadaşlar) gibi, özellikle bash ile ilgili olmayan şeylere sahiptir.

  • ~/.bashrcetkileşimli bir komut satırında istediğiniz bir şey var. Komut istemi, EDITORdeğişken, bash takma adımı kullanmam için

Birkaç başka not:

  • Grafiksel uygulamalarda VEYA sh (veya olarak çağrılan bash sh) kullanılabilir olması gereken her şey~/.profile

  • ~/.bashrc hiçbir şey çıkmamalı

  • Sadece giriş kabukları için uygun olan her şey girilmelidir ~/.profile

  • Bunun ~/.bash_loginolmadığından emin olun .


3
+1, bu, ~/.profileaçıkça çalışan / bin / sh komutunu çalıştıran GDM / LightDM / LXDM gibi servisler için ortamı doğru şekilde ayarlamayı sağlar .
Grawity,

12
Benim .bashrcçıkışları oldukça bir sürü şey, bunu yorumlayabilir misiniz? Özellikle, tebrik çıktısını nereye koymalıyım?
Calimo

14
@Calimo: Yalnızca interaktif modda çıktılar al. Bunun [[ $- == *i* ]]için özel $-değişkende 'i' yi arayarak test edebilirsiniz . Elbette, bash'ın .bashrcetkileşimli olmayan modda okumak için derlendiği sistemlerde yalnızca ilk sırada önemlidir . (Yani., Debian ancak Arch ise) Ama kullanarak bağlanmaya çalışırken gizemli hata mesajlarının sık nedeni var sftpya scpveya benzer aletler.
Grawity

4
Şimdi bilmeliyim ki - neden .bash_login olmasın? Bu ne işe yarıyor?
tedder42

11
@ tedder42: Bu aynı yapar .bash_profileve .profile. Fakat bash, yalnızca üçte birinciyi okuyor. Yani, eğer bir varsa .bash_login, her ikisi de .profileve .bash_profilegizemli bir şekilde göz ardı edilecektir.
Grawity

54

Son birkaç yıl içinde, ben boşa çok zaman yaşadım, bu yüzden var sadece 10 dakikada biraz daha bu araştırdı. Bunun en iyi düzen olup olmadığı hakkında hiçbir fikrim yok, hemen hemen her durumda doğru şekilde çalışan sadece bir tanesi.

Gereksinimler:

  • ~/.profile Herhangi bir / bin / sh ile uyumlu olmalıdır - buna bash, çizgi, ksh, bir dağıtıcının kullanmayı tercih edebileceği herhangi bir şey dahildir.

  • Ortam değişkenleri hem konsol girişleri (yani 'giriş' kabuğu) hem de grafik girişleri (örn. GDM, LightDM veya LXDM gibi ekran yöneticileri) tarafından okunan bir dosyaya konulmalıdır.

  • Sahip çok az anlamı yoktur hem ~/.profile ve ~/.bash_profile. İkincisi eksikse, bash mutlu bir şekilde eskiyi kullanır ve bash'a özgü tüm çizgiler $BASHveya ile kontrol edilerek korunabilir $BASH_VERSION.

  • Arasındaki ayrılma *profileve *rceski 'giriş' kabuklar için kullanılır ve bir terminal pencereyi açmak her zaman ikinci olmasıdır. Ancak, 'giriş' modunda bash kaynak yapmaz ~/.bashrc, bu nedenle ~/.profilemanuel olarak yapmanız gerekir.

En basit yapılandırma şöyle olacaktır:

  • Bir var ~/.profile(bash özgü olanlar hariç) bütün ortam değişkenlerini ayarlar ki, belki bir çizgi ya da iki yazdırır, sonra kaynaklar ~/.bashrcaksi sh uyumlu sözdizimine yapışmasını, bash tarafından yürütülüyor eğer.

    ihracat TZ = "Avrupa / Paris"
    dışa aktarma EDITOR = "vim"
    eğer ["$ BASH"]; sonra
        . ~ / .Bashrc
    fi
    çalışma süresi
    
  • Bir var ~/.bashrcbir çekle korunan herhangi kabuk özgü kurulum, performansa sahip olduğunu interaktif modda gibi şeyler bozulmaması için sftpDebian (bash seçeneğiyle derlendi yüklemek için ~/.bashrcbile olmayan etkileşimli kabuklarda):

    [[$ - == * i *]] || 0 döndür
    
    PS1 = '\ h \ w \ $'
    
    start () {sudo hizmeti "$ 1" başlangıç; }
    

Bununla birlikte, etkileşimli olmayan bazı komutların (örn. ssh <host> ls) Atlaması sorunu da vardır ~/.profile, ancak ortam değişkenleri onlar için çok yararlı olacaktır.

  • Bazı dağıtımlar (örneğin Debian) ~/.bashrc, bu etkileşimli olmayan girişler için kaynak sağlama seçeneğiyle bash'lerini derler . Bu durumda, bunu kullanışlı tüm ortam değişkenleri (taşımak buldum export ...ayrı dosyaya hatları), ~/.environve onu kaynak hem .profile ve .bashrciki kez yapıyor önlemek için bir bekçi ile:

    Eğer ! ["$ PREFIX"]; Sonra    # veya $ EDİTÖR veya $ TZ veya ... 
        . ~ / .environ            # genellikle .environ'ın ayarlayacağı herhangi bir değişken
    fi
    
  • Ne yazık ki, diğer dağıtımlar için (örneğin, Arch) çok iyi bir çözüm bulamadım. Bir olasılık, (varsayılan olarak etkindir) pam_env PAM modülünü, aşağıdakileri koyarak kullanmaktır ~/.pam_environment:

    BASH_ENV =. /. Environ         # yazım hatası değil; bir yol olması gerekir, ancak ~ işe yaramaz
    

    Sonra, elbette, güncellenmesi ~/.environiçin unset BASH_ENV.


Sonuç? Kabuklar bir acıdır. Çevre değişkenleri bir acıdır. Dağılıma özgü derleme zamanı seçenekleri eşek muazzam bir acı vardır.


2
Geçen paragraf için 1 ama kaynak tercih .profileve .bashrcgelen .bash_profileve tutmak .profiletemiz.
nyuszika7h

@ nyuszika7h: Benim .profile temiz , teşekkürler.
Grawity

1
Bir pencereyi her açtığınızda, yorumun
Mark

1
"Çok küçük bir nokta olması hem de vardır ~/.profileve ~/.bash_profile": Ne disdagree. Neden diye Dan'in cevabına bakınız.
rubenvb

@rubenvb İlgili bölümü alıntılayabilir misiniz? Sadece şartlara sahip olmak .profileve bashbelirli bölümleri şartlandırmakla korumanın iyi olduğunu düşünüyorum .
Kelvin

36

ShreevatsaR'ın bu mükemmel blog gönderisine bir göz atın . İşte bir alıntı, ancak blog gönderisine gidin, "giriş kabuğu", bir akış şeması ve Zsh için benzer bir tablo gibi terimler için bir açıklama içerir.

Bash için şu şekilde çalışırlar. Uygun sütunu okuyun. A, sonra B, sonra C, vb. Çalıştırır. B1, B2, B3, bulunan dosyaların yalnızca ilkini çalıştırdığı anlamına gelir.

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+

Bu güzel. Genelde /etc/profileçağrıları /etc/bash.bashrcve ~/.profileçağrıları not etmek önemlidir ~.bashrc. Çok etkili /etc/bash.bashrcve ~/.bashrcEtkileşimli Girişler için de uygulanıyor.
WISBucky

Bazı dağıtımların bu şemayı geçersiz kıldığına dikkat edin (garip sonuçlarla) - örneğin, opensuse'a yönelik hata raporuma bakın: bugzilla.opensuse.org/show_bug.cgi?id=1078124
Christian Herenz,

Btw. en azından bash ile bu dosyaların hiçbiri bash çağrıldığında çalıştırılmaz/bin/sh
JepZ

@JepZ Haklısın, "Script" adlı üçüncü sütunun açıklaması.
Flimm

1
@ Flimm Eh, 'Script' sütunu etkileşimli olmayan bir betiği bash (örn / bin / bash) ile başlattığınızda ne olacağını açıklar . Ancak, bir betiği sh ile başlatırsanız (ve / bin / sh, / bin / bash ile bir bağlantıdır) yukarıdakilerin hiçbiri çalıştırılmaz (hatta değil BASH_ENV). Bash man sayfasının ilgili paragrafı arayarak bulunabilir If bash is invoked with the name sh.
JepZ

21

Size "kapsamlı" rehberlerimi sunuyorum:

  • Varsa, yap .bash_profileve .profileyükle .bashrc, örneğin [ -r $HOME/.bashrc ] && source $HOME/.bashrc
  • Her şeyi içine koy .bashrc.
  • Endişelenmeyi bırak.
  • Her dört yılda bir, pes etmeden ve "endişelenme" ye dönmeden önce bu soruyu araştırmak için on dakikanızı ayırın.

EDIT: Herkesin inanması için cazip olması durumunda "kapsamlı" için korkutucu tırnak eklendi. ;)


3
Her ikisine de sahip olmak .bash_profileve .profilebiraz fazlalık olması; sadece ikincisine ihtiyacınız var. if [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fiDosyayı / bin / sh komut dosyasından manuel olarak alan programlar (yani gdm / lightdm) olduğu için / bin / sh-proof yapmanıza gerek yoktur . Bu aynı zamanda tutulan ortamın .bashrcetkisiz olacağı anlamına gelir . "Kapsamlı" yönergeleriniz, birkaç kez zor yoldan öğrendiğim gibi, birçok sistemde çalışmayacağından, -1'e gitmek zorunda kaldım.
Grawity

Hiç sorun değil, mutlu bir şekilde sadece yanak dili "kapsamlı" olmayan bir cevap için -1 ödeyeceğim ve kesinlikle bu ünvanı kazandınız.
Mechanical Fish,

0

Bunu anlamaya çalışmaktan vazgeçtim ~/.shell-setupve diğerlerinden kaynak aldığım bir senaryo ( ) yazdım.

Bu yaklaşım ~/.shell-setupiki özelliğe sahip olmayı gerektirir :

  1. Sadece bir kez, art arda kaynaklı olsa bile koş ( koruyucuları kullan )
  2. İstenmeyen bir çıktı oluşturmayın (çıktı uygun olduğunda algıla)

# 1 oldukça standart, ancak kabuk komut dosyalarında çok fazla kullanılmamasına rağmen.

# 2 daha zorlu. İşte bash dediğim şey:

if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
    echo "Hello user!" # ... etc
fi

Ne yazık ki, bununla nasıl karşılaştığımı ya da neden etkileşimli bir kabuk algılamanın yeterli olmadığını hatırlamıyorum .


-2

Her şeyi koyun .bashrcve daha sonra kaynak .bashrcdan.profile

Bash man sayfasından (OS X 10.9'da):

Giriş kabuğu olmayan etkileşimli bir kabuk başlatıldığında, bash bu dosya varsa ~ / .bashrc komutlarını okur ve yürütür. Bu --norc seçeneği kullanılarak engellenebilir. --Rcfile dosyası seçeneği bash'ı ~ / .bashrc yerine dosyadan komutları okumaya ve yürütmeye zorlar

Yukarıdaki metin her şeyin neden yerleştirildiğidir .bashrc. Ancak, bir giriş kabuğu ile çalışırken biraz farklı bir davranış var. Yine, man sayfasından alıntı:

Bash etkileşimli bir giriş kabuğu olarak veya --login seçeneğiyle etkileşimli olmayan bir kabuk olarak çağrıldığında, önce bu dosya varsa / etc / profile dosyasındaki komutları okur ve yürütür. Bu dosyayı okuduktan sonra, bu sırayla ~ / .bash_profile, ~ / .bash_login ve ~ / .profile ifadelerini arar ve var olan ve okunabilen ilk komuttan komutları okur ve yürütür. --Noprofile seçeneği, kabuk bu davranışı engellemeye başladığında kullanılabilir.

.profilegiriş kabukları için okunur, ancak .bashrcdeğildir. Tüm bu şeyleri çoğaltmak .bashrckötü ™ olduğundan .profile, davranışın tutarlı kalması için onu kaynaklamamız gerekir .

Ancak, kaynak istemiyoruz .bashrcgelen .profilekayıtsız şartsız. Lütfen daha fazla detay için yorumları ve diğer cevapları inceleyin.


4
-1, YAPMAYIN kaynak .bashrcdan .profile. @ DanRabinowitz'in cevabına bakınız.
nyuszika7h

En azından kayıtsız şartsız.
nyuszika7h

[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrciçin tatlı bir oneliner olurdu .profile.
John WH Smith

@ nyuszika7h, Neden olmasın? Herkes böyle yapmayı öneriyor gibi görünüyor .
Pacerier
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.