Arasındaki fark nedir .bashrc
ve .bash_profile
ben hangisinin kullanmalıyım?
.profile
, şu soruya bir göz atın: superuser.com/questions/789448/…
Arasındaki fark nedir .bashrc
ve .bash_profile
ben hangisinin kullanmalıyım?
.profile
, şu soruya bir göz atın: superuser.com/questions/789448/…
Yanıtlar:
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, ~/.profile
giriş kabuğu olarak çağrıldığında gelen komutları okur .
Bash, Bourne benzeri bir kabuktur. ~/.bash_profile
Oturum açma kabuğu olarak çağrıldığında gelen komutları okur ve eğer bu dosya yoksa¹, bunun ~/.profile
yerine 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_profile
veya 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.
~/.bashrc
takma 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_profile
yerine 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, ~/.bashrc
kabuğ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 ~/.profile
bağ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 ~/.bashrc
terminal 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_profile
yoksa, bash da .bash_login
düşmeden önce çalışır .profile
. Var olduğunu unutmaktan çekinmeyin.
~/.bash_profile
yerine kullanılabilir ~/.profile
, ama aynı zamanda eklemeniz gerekir ~/.bashrc
kabuk etkileşimli ise. bunlar ortogonal meseleler olduğu için yanıltıcıdır. İsterseniz kullanın ~/.bash_profile
ya da oradaki ayarların oturum açma kabuğunda etkili olmasını istiyorsanız, kullandığınıza ~/.profile
dahil etmeniz gerekir ~/.bashrc
.
~/.bashrc
seç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
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.
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
.$HOME/.bashrc
Zengin yukarıda gösterdiği gibi, ayarlar .bashrc
ve böylece masaüstü ortamı hem de giriş kabukları mevcut olacak ve. Örneğin, benim Fedora sistemde, gnome-session
olarak başlatılır -$SHELL -c gnome-session
, böylece .profile
okunur.
.bashrc
içinde .profile
tipik çünkü çalışmaz .profile
tarafı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.
[[ $- != *i* ]] && return
") önerisine ekleyeceğim ; Bazılarımın .bashrc
etkileş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 .bashrc
dikkate alınmamalıdır. Genellikle TERM = aptal ve / veya mutsuz olup olmadığını kontrol ederim ve sonra erken ayrılırım.
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 | | |
+----------------+-----------+-----------+------+
[ -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" ] && return
içeriyorsa, elbette etkili olacak, ama bunun değiştirilmesi gerektiğini düşünmemeliyim. tablo.
/ 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.
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/bashrc
testleri olup olmadığını:
... 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_completion
komut. Geriye dönük uyumluluk nedeniyle, bash işlevini değiştirmek /bin/sh
yerine 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