.Bashrc ve .bash_profile arasındaki fark
Arasındaki fark nedir .bashrcve .bash_profileve hangisinin kullanmalıyım?
Yanıtlar
Geleneksel olarak, bir Unix sisteminde oturum açtığınızda, sistem sizin için bir program başlatır. Bu program bir kabuktur, yani diğer 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ırsınız. Bir Bourne kabuğu olan varsayılan kabuk, ~/.profileoturum açma kabuğu olarak çağrıldığında komutları okur .
Bash, Bourne benzeri bir kabuktur. ~/.bash_profileGiriş kabuğu olarak çağrıldığı andan itibaren komutları okur ve bu dosya yoksa¹, okumayı dener ~/.profile.
Bir kabuğu, örneğin bir GUI ortamında bir terminal öykünücüsü başlatarak, istediğiniz zaman doğrudan çağırabilirsiniz. Kabuk bir giriş kabuğu değilse, okumaz ~/.profile. Bash'i etkileşimli bir kabuk olarak başlattığınızda (yani, bir komut dosyası çalıştırmamak için), okur ~/.bashrc(bir oturum açma kabuğu olarak çağrılmadığı sürece, o zaman yalnızca ~/.bash_profileveya okur) ~/.profile.
Bu nedenle:
~/.profileoturum açtığınızda başlatmak istediğiniz programlar (ancak grafiksel programlar değil, farklı bir dosyaya girerler) ve ortam değişkeni tanımları gibi tüm oturumunuz için geçerli olan şeyleri koyabileceğiniz yerdir.~/.bashrctakma ad ve işlev tanımları, kabuk seçenekleri ve komut ayarları gibi yalnızca bash için geçerli olan şeyleri koyabileceğiniz yerdir. (Oraya anahtar bağlamaları da koyabilirsiniz, ancak bash için normalde girerler~/.inputrc.)~/.bash_profileyerine kullanılabilir~/.profile, ancak başka herhangi bir kabuk tarafından değil, yalnızca bash tarafından okunur. (Bu, başlatma dosyalarınızın birden fazla makinede çalışmasını istiyorsanız ve oturum açma kabuğunuz hepsine basmıyorsa, çoğunlukla bir endişe kaynağıdır.)~/.bashrcKabuğun etkileşimli olması durumunda burası 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, ile ilgili ek bir komplikasyon var ~/.profile. Grafik bir ortamda oturum açarsanız (yani, parolanızı yazdığınız program grafik modunda çalışıyorsa), otomatik olarak okuyan bir oturum açma kabuğu almazsınız ~/.profile. Grafiksel oturum açma 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 oturum açtığınızda başlatılacak ortam değişkenlerini ve programlarını tanımlayabileceğiniz başka bir yer vardır, ancak maalesef standart bir konum yoktur.
Burada ve orada ortam değişkeni tanımlarını yerleştirmek ~/.bashrcveya her zaman terminallerde oturum açma kabuklarını başlatmak için öneriler görebileceğinizi unutmayın . İkisi de kötü fikirlerdir. Bu fikirlerden herhangi biriyle ilgili en yaygın sorun, ortam değişkenlerinizin doğrudan bir simge veya menü veya klavye kısayolu ile başlatılan programlarda değil, yalnızca terminal aracılığıyla başlatılan programlarda ayarlanacak olmasıdır.
¹ Tamlık için, istek üzerine: .bash_profileyoksa, bash da .bash_logingeri dönmeden önce dener .profile. Onun varlığını unutmakta özgürsünüz.
Bu kısa makaleden
Bash man sayfasına göre, oturum açma kabukları için .bash_profile çalıştırılırken, oturum açma olmayan etkileşimli kabukları için .bashrc çalıştırılır.
Oturum açma veya oturum açma olmayan kabuk nedir?
Konsol aracılığıyla oturum açtığınızda (örn: kullanıcı adı ve parolayı yazın), önyükleme sırasında fiziksel olarak makinede otururken veya ssh aracılığıyla uzaktan: .bash_profile, ilk komut isteminden önce işleri yapılandırmak için çalıştırılır.
Ancak, makinenizde zaten oturum açtıysanız ve Gnome veya KDE içinde yeni bir terminal penceresi (xterm) açarsanız, pencere komut isteminden önce .bashrc yürütülür. .bashrc, bir terminalde / bin / bash yazarak yeni bir bash örneği başlattığınızda da çalıştırılır.
Eski günlerde, sözde tty'lerin sahte olmadığı ve aslında iyi yazılmış olmadığı ve UNIX'lere modemler tarafından çok yavaş erişildiği zamanlarda, her harfin ekranınıza yazdırıldığını görebiliyordunuz, verimlilik çok önemliydi. Verimliliğe bir şekilde yardımcı olmak için, bir ana oturum açma penceresi ve aslında çalışmak için kullandığınız diğer pencereler konseptine sahiptiniz. Ana pencerenizde, herhangi bir yeni postayla ilgili bildirim almak istersiniz, muhtemelen arka planda başka programları çalıştırırsınız.
Bunu desteklemek için, kabuklar .profileözellikle 'oturum açma kabuklarında' bir dosya oluşturdu . Bu, bir oturum kurulumundan sonra özel yapacaktı. Bash, bunu .profile'dan önce .bash_profile'a bakacak şekilde genişletti, bu şekilde içine sadece şeyleri bash koyabilirsiniz (böylece, Bourne kabuğunu, aynı zamanda .profile'a da bakan Bourne kabuğunu, vb. Bozmazlar). Oturum açma olmayan diğer kabuklar yalnızca rc dosyasını, .bashrc'yi (veya .kshrc, vb.) Besler.
Bu şimdi biraz anakronizm. Bir gui pencere yöneticisinde oturum açtığınız kadar ana kabukta oturum açmazsınız. Diğer pencerelerden farklı bir ana pencere yoktur.
Benim önerim - bu fark için endişelenmeyin, daha eski bir unix kullanma stiline dayanıyor. Dosyalarınızdaki farkı ortadan kaldırın. .Bash_profile dosyasının tüm içeriği şu şekilde olmalıdır:
[ -f $HOME/.bashrc ] && . $HOME/.bashrc
Ve aslında ayarlamak istediğiniz her şeyi .bashrc içine koyun
.Bashrc'nin etkileşimli ve etkileşimli olmayan tüm kabuklar için kaynaklandığını unutmayın. Bu kodu .bashrc'nin üst kısmının yakınına koyarak etkileşimli olmayan kabukların kaynağında kısa devre yapabilirsiniz:
[[ $- != *i* ]] && return
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" gibi terimler için bir açıklama, bir akış şeması ve Zsh için benzer bir tablo içerir.
Bash için aşağıdaki gibi çalışırlar. Uygun sütunu okuyun. A, sonra B, sonra C, vb. Yürütür. B1, B2, B3, bulunan dosyalardan 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 | | |
+----------------+-----------+-----------+------+
/ ETC / PROFİL BAŞKANI İÇİN DAHA İYİ BİR YORUM
Yukarıdaki Flimm harika cevap üzerine kurulan, benim Debian başında bu yeni açıklama takılı /etc/profile, (eğer dağıtıma için ayarlamak 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 buna başvurmak için diğer kurulum dosyalarının her birinin başındaki bu not:
# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE
Bence Debian'ın /etc/profilevarsayılan kaynakları (içerir) /etc/bash.bashrc, (var olduğu zaman /etc/bash.bashrc). Dolayısıyla, oturum açma komut /etcdosyaları her iki dosyayı okurken , oturum açma olmayanlar yalnızca bash.bashrc'yi okur.
Ayrıca, /etc/bash.bashrcetkileşimli olarak çalıştırılmadığında hiçbir şey yapmayacak şekilde ayarlanmıştır. Dolayısıyla bu iki dosya yalnızca etkileşimli komut dosyaları içindir.
Bash'in kendi yapılandırma mantığı çılgınca karmaşık değildir ve bu sayfadaki diğer yanıtlarda, serverfault'da ve birçok blogda açıklanmıştır. Ancak sorun , Linux dağıtımlarının bash'den ne anlama geldiği, yani bash'ı varsayılan olarak yapılandırdıkları karmaşık ve çeşitli yolları kastediyorum.http://mywiki.wooledge.org/DotFilesbu tuhaflıklardan kısaca bahsediyor. İşte Fedora 29'daki bir örnek izleme, hangi dosyaların hangi diğer dosya (lar) dan kaynaklandığını ve çok basit bir senaryo için hangi sırayla: ssh ile uzaktan bağlanmak ve ardından başka bir alt kabuğa başlamak için:
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ığı /etc/bashrc. Yukarıda görüldüğü gibi /etc/bashrc, bash'ın kendisinin bilmediği bir dosya, yani doğrudan değil. Fedora, /etc/bashrcşunları test eder:
- bir giriş kabuğu tarafından sağlanıyor,
- etkileşimli bir kabuk tarafından sağlanıyor,
- zaten kaynaklı
... ve sonra bunlara bağlı olarak tamamen farklı şeyler yapar.
Yukarıdaki grafiği hatırlayabileceğinizi düşünüyorsanız çok kötü çünkü neredeyse yeterli değil: bu grafik yalnızca bir senaryoyu açıklıyor, etkileşimli olmayan komut dosyalarını çalıştırırken veya bir grafik oturumu başlatırken biraz farklı şeyler oluyor. İhmal ettim ~/.profile. Ben ihmal ettik bash_completionkomut. Geriye dönük uyumluluk nedenlerinden dolayı, davranışını değiştirmek /bin/shyerine bash'ı çağırmak /bin/bash. Peki ya zsh ve diğer kabuklar? Ve elbette farklı Linux dağıtımları işleri farklı şekilde yapar, örneğin Debian ve Ubuntu bas h'nin standart olmayan bir sürümüyle gelir, Debian'a özgü özelleştirmelere sahiptir. Bu özellikle alışılmadık dosyayı arar: /etc/bash.bashrc. Tek bir Linux dağıtımına bağlı kalsanız bile, muhtemelen zamanla gelişir. Bekleyin: macOS, FreeBSD'ye bile dokunmadık ... Son olarak, yöneticilerinin kullanmak zorunda oldukları sistemi daha da yaratıcı şekilde yapılandırdıklarına takılıp kalan kullanıcılar için bir düşünelim.
Bu konudaki hiç bitmeyen tartışma akışının da gösterdiği gibi, bu kayıp bir neden. Sadece yeni değerler eklemek istediğiniz sürece, biraz "deneme yanılma" yeterli olabilir. Gerçek eğlence , bir (kullanıcı) dosyasında önceden tanımlanmış bir şeyi (/ vb. İçinde) değiştirmek istediğinizde başlar . Ardından, asla taşınabilir olmayacak bir çözümü tasarlamak için biraz zaman harcamaya hazır olun.
Son bir parça eğlence için, Haziran 2019 itibarıyla Clear Linux'ta aynı basit senaryonun "kaynak grafiği":
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