.Bashrc ve .bash_profile arasındaki fark


450

Arasındaki fark nedir .bashrcve .bash_profileben hangisinin kullanmalıyım?



Aynı zamanda daha kapsamlı bir açıklama da istiyorsanız .profile, şu soruya bir göz atın: superuser.com/questions/789448/…
Flimm

Bu cevap ayrıca bazı yönleri de kapsar. Stackoverflow.com/questions/415403/…
Sergey Voronezhskiy

Yanıtlar:


518

Geleneksel olarak, bir Unix sistemine giriş yaptığınızda, sistem sizin için bir program başlatır. Bu program bir kabuktur, yani başka programları başlatmak için tasarlanmış bir programdır. Bu bir komut satırı kabuğu: adını yazarak başka bir program başlatıyorsunuz. Bir Bourne kabuğu olan varsayılan kabuk, ~/.profilegiriş kabuğu olarak çağrıldığında gelen komutları okur .

Bash, Bourne benzeri bir kabuktur. ~/.bash_profileOturum açma kabuğu olarak çağrıldığında gelen komutları okur ve eğer bu dosya yoksa¹, bunun ~/.profileyerine okumaya çalışır .

Bir kabuğu doğrudan istediğiniz zaman, örneğin bir GUI ortamı içinde bir terminal emülatörü başlatarak çağırabilirsiniz. Kabuk bir giriş kabuğu değilse, okumaz ~/.profile. Bash'ı etkileşimli bir kabuk olarak başlattığınızda (yani bir komut dosyasını çalıştırmamak için), okur ~/.bashrc(bir giriş kabuğu olarak çağrıldığı zamanlar dışında, sadece ~/.bash_profileveya okur) ~/.profile.

Bu nedenle:

  • ~/.profile Oturum açtığınızda başlatmak istediğiniz programlar (ancak grafik programları değil, farklı bir dosyaya giderler) ve ortam değişkeni tanımları gibi tüm oturumunuz için geçerli olan öğeleri koyabileceğiniz yerdir.

  • ~/.bashrctakma ad ve işlev tanımları, kabuk seçenekleri ve bilgi istemi ayarları gibi yalnızca bash öğesi için geçerli olan öğeleri koyacağınız yerdir. (Ayrıca orada anahtar ciltlemeleri de koyabilirsiniz, ancak bash için normal olarak girerler ~/.inputrc.)

  • ~/.bash_profileyerine kullanılabilir ~/.profile, ancak başka bir kabuk tarafından değil, yalnızca bash ile okunur. (Başlatma dosyalarınızın birden fazla makinede çalışmasını istiyorsanız ve giriş kabuğunuzun hepsinde bash değilse, bu çoğunlukla bir endişedir.) Bu, ~/.bashrckabuğun etkileşimli olup olmadığını eklemek için mantıklı bir yerdir . Aşağıdaki içerikleri tavsiye ederim ~/.bash_profile:

    if [ -r ~/.profile ]; then . ~/.profile; fi
    case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac

Modern birliklerde, bununla ilgili ek bir komplikasyon var ~/.profile. Grafik bir ortamda oturum açarsanız (yani, şifrenizi yazdığınız program grafik modunda çalışıyorsa), otomatik olarak okuyan bir giriş kabuğu alamazsınız ~/.profile. Grafiksel giriş programına, daha sonra çalıştırdığınız pencere yöneticisine veya masaüstü ortamına ve dağıtımınızın bu programları nasıl yapılandırdığına ~/.profilebağlı olarak, okunabilir veya okunmayabilir. Değilse, genellikle giriş yaptığınızda başlatılacak ortam değişkenlerini ve programlarını tanımlayabileceğiniz başka bir yer vardır, ancak ne yazık ki standart bir yer yoktur.

Burada görebileceğinizi ve ~/.bashrcterminal değişkenlerine ortam değişken tanımlarını koyma veya her zaman oturum açma kabukları başlatma önerileri olduğunu unutmayın . Her ikisi de kötü fikirler. Bu fikirlerden herhangi birinde ortaya çıkan en yaygın sorun, ortam değişkenlerinizin doğrudan bir simge veya menü veya klavye kısayoluyla başlatılan programlarda değil, yalnızca terminal üzerinden başlatılan programlarda ayarlanmasıdır.

¹ Tamamlanmak üzere, istek üzerine: .bash_profileyoksa, bash da .bash_logindüşmeden önce çalışır .profile. Var olduğunu unutmaktan çekinmeyin.


11
İyi yazı için +1. Üstelik "oturum açma grafiği vs oturum açma kabuğu" bölümü eklediğiniz için teşekkür ederim ... ~ / .profile'ın HER ZAMAN grafik / kabuk için yürüteceğini düşündüğüm yerde sorun yaşadım ... ancak kullanıcı oturum açtığında çalışmaz grafiksel giriş yoluyla. Bu gizemi çözdüğün için teşekkürler.
Trevor Boyd Smith

4
@Gilles: Her terminalde bir giriş kabuğu çalıştırmanın neden kötü bir fikir olduğunu örnekleriyle daha ayrıntılı olarak açıklayabilir misiniz? Bu sadece masaüstü Linux ile mi ilgili? (OS X Terminalinde her seferinde bir giriş kabuğu çalıştırdığını ve hiçbir yan etki fark etmediğimi (genellikle iTerm kullandığım halde) topladım. Ancak o zaman dışarıda değer verdiğim birçok çevre değişkenini düşünemiyorum. bir terminal. (Belki HTTP_PROXY?))
iconoclast

2
@Brandon Her terminalde bir giriş kabuğu çalıştırırsanız, ortam tarafından sağlanan ortam değişkenlerini geçersiz kılar. Günlük durumlarda, ondan kurtulabilirsiniz, ancak bir terminalde farklı değişkenler ayarlamak istediğinizde (örneğin, bir programın farklı bir sürümünü denemek için) sizi er ya da geç ısırır: giriş kabuğu yerel ayarlarınızı geçersiz kılar.
Gilles

4
İfadesi ~/.bash_profileyerine kullanılabilir ~/.profile, ama aynı zamanda eklemeniz gerekir ~/.bashrckabuk etkileşimli ise. bunlar ortogonal meseleler olduğu için yanıltıcıdır. İsterseniz kullanın ~/.bash_profileya da oradaki ayarların oturum açma kabuğunda etkili olmasını istiyorsanız, kullandığınıza ~/.profiledahil etmeniz gerekir ~/.bashrc.
Piotr Dobrogost

3
@Gilles Tabi, ama cümlenin cevabında formüle edilme şekli, içerme ihtiyacının, bunun yerine bunun yerine doğru olmayan bir ~/.bashrcseçim yapması gerektiğini gösteriyor . Birisi oturum açma sırasında herhangi bir tür komut dosyası içeriyorsa (burada veya bu ), ayarların oturum açma kabuğuna uygulandığı gibi oturum açma kabuğuna uygulanmasını istemesidir . ~/.bash_profile~/.profile~/.bashrc~/.bash_profile~/.profile~/.bashrc
Piotr Dobrogost

53

Bu kısa makaleden

Bash man sayfasına göre, oturum açma kabukları için .bash_profile yürütülürken, etkileşimli oturum açma olmayan kabukları için .bashrc yürütülür.

Giriş veya giriş olmayan kabuk nedir?

Konsoldan giriş yaptığınızda (örn: kullanıcı adı ve parola yazın), önyükleme yaparken makinede fiziksel olarak otururken veya ssh: .bash_profile ile uzaktan kumanda edildiğinde ilk komut isteminden önce işleri yapılandırmak için çalıştırılır.

Ancak, zaten makinenize giriş yaptıysanız ve Gnome veya KDE içinde yeni bir terminal penceresi (xterm) açtıysanız, .bashrc, pencere komut isteminden önce yürütülür. .bashrc ayrıca bir terminale / bin / bash yazarak yeni bir bash örneğini başlattığınızda da çalıştırılır.


12
Hafif güncellemeler: 'Executed' muhtemelen biraz yanıltıcı bir terimdir, ikisi de kaynaklıdır. Yürütülen sesler bir script olarak çalıştırılmış, fork / exec yadda yadda. Geçerli kabuk bağlamında çalıştırılır. Daha önemlisi, .bashrc çok daha sık çalıştırılır. Her bash betiğinde çalıştırılır ve eğer bir .bash_profile dosyanız yoksa. Ayrıca, xterms'inizi nasıl kurduğunuza bağlı olarak .bash_profile
Rich Homolka

36

Eski günlerde, sahte tty'lerin sahte olmadığı ve gerçekte iyi yazılmış olduğu ve UNIX'lere modemler tarafından erişildiği için o kadar yavaş ki, ekrana yazdırılan her harfi görebiliyordunuz. Verimliliği artırmak için, bir ana giriş penceresi kavramı ve aslında hangi pencereleri kullanıyorsanız kullanın. Ana pencerenizde, herhangi bir yeni postayla ilgili bildirim almak, muhtemelen arka planda başka programlar çalıştırmak isteyebilirsiniz.

Bunu desteklemek için, kabukları .profileözellikle 'giriş kabukları' üzerine bir dosya kaynaklı . Bu bir seans kurulumunda özel bir şey yapacaktır. Bash, önce .bash_profile'ye bakmak için biraz uzattı .profile, bu şekilde orada sadece bash şeyleri koyabilirsiniz (böylece Bourne kabuğunu, vb. Giriş yapılmayan diğer kabuklar sadece rc dosyasını, .bashrc (veya .kshrc, vb.) Kaynak olacaktır.

Bu şimdi biraz bir anakronizm. Bir gui pencere yöneticisine giriş yaptığınız kadar ana bir kabuğa giriş yapmazsınız. Diğer pencerelerden farklı ana pencere yoktur.

Önerim - bu fark için endişelenmeyin, eski bir unix kullanma stiline dayanıyor. Dosyalarınızdaki farkı ortadan kaldırın. .Bash_profile dosyasının bütün içeriği şöyle olmalıdır:

[ -f $HOME/.bashrc ] && . $HOME/.bashrc

Ve gerçekte .bashrc içine koymak istediğiniz her şeyi koyun

.Bashrc'nin etkileşimli ve etkileşimli olmayan tüm kabukları için oluşturulduğunu unutmayın. Bu kodu .bashrc'nin üst kısmına yakın tutarak etkileşimli olmayan kabuklar için kaynağı kısa devre yapabilirsiniz:

[[ $- != *i* ]] && return


6
Bu kötü bir fikir, cevabımı gör . Özellikle, ortam değişkenleriniz doğrudan bir simge veya menü veya klavye kısayoluyla başlatılan programlarda değil, yalnızca terminal üzerinden başlatılan programlarda ayarlanır.
Gilles

4
@ Gilles Bunu neden iddia ettiğini anlamıyorum. İle .$HOME/.bashrcZengin yukarıda gösterdiği gibi, ayarlar .bashrcve böylece masaüstü ortamı hem de giriş kabukları mevcut olacak ve. Örneğin, benim Fedora sistemde, gnome-sessionolarak başlatılır -$SHELL -c gnome-session, böylece .profileokunur.
Mikel

2
@PiotrDobrogost Ah, evet, Rich'in cevabında başka bir sorun var. Dahil .bashrciçinde .profiletipik çünkü çalışmaz .profiletarafından yürütülebilir /bin/sh(varsayılan olarak bir grafik giriş için Ubuntu üzerinde örneğin) bash değil ve bu kabuk etkileşimli (grafiksel giriş için örneğin) olmayabilir.
Gilles

3
@Gilles re: “.profile .bashrc dahil” tavsiye edilen şey değildir (aslında tam tersi). Cevap düzenlenmiş (öyle görünmüyor) ya da yorumlarınız söylenenlerle uyuşmuyor.
michael

2
Genel olarak, +1, ancak "etkileşimli olmayan kabuklar için kısa devre ..." (".bashrc'ın üst kısmına yakın: [[ $- != *i* ]] && return") önerisine ekleyeceğim ; Bazılarımın .bashrcetkileşimli olmayan mermilerde bile çalıştırılmasını, özellikle env değişkenlerinin yayınlanmasını ssh hostname {command}, böylece uzak komutların doğru şekilde çalıştırılmasını (kabuk etkileşimli olmasa bile) ayarlamasını seviyorum . Ancak daha sonra yapılacak diğer ayarlar .bashrcdikkate alınmamalıdır. Genellikle TERM = aptal ve / veya mutsuz olup olmadığını kontrol ederim ve sonra erken ayrılırım.
michael

18

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      |           |      |
+----------------+-----------+-----------+------+

Aynı cevabı birden fazla soruya göndermektense, cevabınızı sorunuzun özel ihtiyaçlarına göre uyarlamanız tercih edilir. Cevap her iki soru için de aynıysa, tek bir cevap göndermeli ve diğer soruları aslının kopyaları olarak kapatmak için oy kullanmalısınız.
Mokubai

1
@Mokubai Diğer soru zaten bunun bir kopyası olarak işaretlendi.
Flimm

@ElipticalView: set hiçbir şey yapmamak tarafından, çizgiyi kastediyorsunuz: [ -z "$PS1" ] && return? Cevabımdaki tablo, senaryoların içeriğinden bağımsız olarak Bash'in çalıştırdığı senaryoların listesini veriyor, eğer senaryonun kendisi bir satır [ -z "$PS1" ] && returniçeriyorsa, elbette etkili olacak, ama bunun değiştirilmesi gerektiğini düşünmemeliyim. tablo.
Flimm

5

/ VB / PROFİL BAŞKANI İÇİN DAHA İYİ BİR YORUM

Flimm'in yukarıdaki büyük cevabını temel alarak, bu yeni yorumu Debian / etc / profile kitabımın başında belirledim (dağıtımınız için ayarlamanız gerekebilir.) :

# For BASH: Read down the appropriate column. Executes A, then B, then C, etc.
# The B1, B2, B3 means it executes only the first of those files found.  (A)
# or (B2) means it is normally sourced by (read by and included in) the
# primary file, in this case A or B2.
#
# +---------------------------------+-------+-----+------------+
# |                                 | Interactive | non-Inter. |
# +---------------------------------+-------+-----+------------+
# |                                 | login |    non-login     |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   ALL USERS:                    |       |     |            |
# +---------------------------------+-------+-----+------------+
# |BASH_ENV                         |       |     |     A      | not interactive or login
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile                     |   A   |     |            | set PATH & PS1, & call following:
# +---------------------------------+-------+-----+------------+
# |/etc/bash.bashrc                 |  (A)  |  A  |            | Better PS1 + command-not-found 
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/bash_completion.sh|  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/vte-2.91.sh       |  (A)  |     |            | Virt. Terminal Emulator
# |/etc/profile.d/vte.sh            |  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   A SPECIFIC USER:              |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_profile    (bash only)   |   B1  |     |            | (doesn't currently exist) 
# +---------------------------------+-------+-----+------------+
# |~/.bash_login      (bash only)   |   B2  |     |            | (didn't exist) **
# +---------------------------------+-------+-----+------------+
# |~/.profile         (all shells)  |   B3  |     |            | (doesn't currently exist)
# +---------------------------------+-------+-----+------------+
# |~/.bashrc          (bash only)   |  (B2) |  B  |            | colorizes bash: su=red, other_users=green
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_logout                   |    C  |     |            |
# +---------------------------------+-------+-----+------------+
#
# ** (sources !/.bashrc to colorize login, for when booting into non-gui)

Ve başvuru için diğer kurulum dosyalarının her birinin başında bulunan bu not:

# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE

Bence kayda değer, Debian'ın / etc / profile (varsayılan) /etc/bash.bashrc (/etc/bash.bashrc var olduğunda) kaynaklarına göre. Bu nedenle, giriş komut dosyaları / etc dosyalarını okurken, giriş olmayanlar yalnızca bash.bashrc dosyasını okur.

Ayrıca, /etc/bash.bashrc'ın etkileşimli bir şekilde çalışmadığında hiçbir şey yapmayacak şekilde ayarlandığı not edilmelidir. Yani bu iki dosya sadece etkileşimli komut dosyaları içindir.


4

Bash'ın kendisinin konfigürasyon mantığı delice karmaşık değildir ve bu sayfadaki diğer cevaplarda, sunucu hatalarında ve birçok blogda açıklanmıştır. Bununla birlikte sorun , Linux dağıtımlarının bash yapmaktan kaynaklandığı şeydir, demek istediğim, bash'ı varsayılan olarak yapılandırdıkları karmaşık ve çeşitli yollar. http://mywiki.wooledge.org/DotFiles , bu tuhaflıkların bazılarından kısaca bahseder. İşte Fedora 29'da bir örnek izleme, hangi dosyaların hangi dosyalardan kaynaklandığını ve hangi sırayla çok basit bir senaryo için olduğunu gösteriyor: uzaktan ssh ile bağlanma ve sonra başka bir alt kabuk başlatma:

ssh fedora29
 └─ -bash # login shell
      ├── /etc/profile
      |    ├─ /etc/profile.d/*.sh
      |    ├─ /etc/profile.d/sh.local
      |    └─ /etc/bashrc
      ├── ~/.bash_profile
      |    └─ ~/.bashrc
      |          └─ /etc/bashrc
      |
      |
      └─ $ bash  # non-login shell
            └─ ~/.bashrc
                 └─ /etc/bashrc
                       └─ /etc/profile.d/*.sh

Fedora'nın en karmaşık mantığı içeride /etc/bashrc. Yukarıda görüldüğü gibi /etc/bashrc, bash'in kendisi hakkında bilmediği bir dosya olduğu için doğrudan değil demek istiyorum. Fedora'nın /etc/bashrctestleri olup olmadığını:

  • bir giriş kabuğu tarafından kaynaklanıyor,
  • etkileşimli bir kabuk tarafından tedarik ediliyor,
  • zaten kaynaklanmış

... ve sonra bunlara bağlı olarak tamamen farklı şeyler yapar.

Yukarıdaki grafiği çok kötü hatırlayabildiğinizi düşünüyorsanız, çünkü neredeyse yeterli değil: bu grafik yalnızca bir senaryoyu açıklar, etkileşimli olmayan komut dosyalarını çalıştırırken veya bir grafik oturumu başlatırken biraz farklı şeyler olur. İhmal ettim ~/.profile. Ben ihmal ettik bash_completionkomut. Geriye dönük uyumluluk nedeniyle, bash işlevini değiştirmek /bin/shyerine bash çağırmak /bin/bash. Peki ya zsh ve diğer mermiler? Ve elbette, farklı Linux dağıtımları farklı şeyler yapar, örneğin Debian ve Ubuntu standart olmayan bir bash sürümü ile gelir, Debian'a özgü özelleştirmelere sahiptir. Özellikle sıradışı bir dosya arar:/etc/bash.bashrc. Tek bir Linux dağıtımına bağlı kalsanız bile, muhtemelen zamanla gelişir. Bekle: MacOS'a, FreeBSD'ye bile dokunmadık,… Son olarak, yöneticilerinin kullanması gereken sistemi yapılandırmalarının daha yaratıcı yollarını kullanan kullanıcılar için düşünelim.

Bu konuyla ilgili hiç bitmeyen tartışma akışının gösterdiği gibi, bu kaybedilmiş bir sebep. Yeni değerler eklemek istediğiniz sürece, bazı "deneme yanılma" yeterli olacaktır. Asıl eğlence , bir (kullanıcı) dosyasında başka bir tanımlı (/ / vb.) Bir şeyi değiştirmek istediğinizde başlar . Daha sonra, asla taşınabilir olmayacak bir çözüm için biraz zaman harcamak için hazırlıklı olun.

En son eğlenceniz için, Haziran 2019’da Clear Linux’ta aynı, basit senaryo için "kaynak grafik":

ssh clearlinux
 └─ -bash # login shell
      ├── /usr/share/defaults/etc/profile
      |    ├─ /usr/share/defaults/etc/profile.d/*
      |    ├─ /etc/profile.d/*
      |    └─ /etc/profile
      ├── ~/.bash_profile
      |
      |
      └─  $ bash   # non-login shell
           ├─ /usr/share/defaults/etc/bash.bashrc
           |      ├─ /usr/share/defaults/etc/profile
           |      |    ├─ /usr/share/defaults/etc/profile.d/*
           |      |    ├─ /etc/profile.d/*
           |      |    └─ /etc/profile
           |      └─ /etc/profile
           └─ ~/.bashrc
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.