Neden Ubuntu'nun varsayılan ~ / .profile kaynağı ~ / .bashrc?


30

Bunlar, ~/.profile13.10'umla gelen stokun içeriğidir (yorum satırları kaldırıldı):

if [ -n "$BASH_VERSION" ]; then
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Bu Debian'dan devralındı ​​ama neden Canonical bunu sürdürmeye karar verdi? Bildiğim kadarıyla, bu standart * nix yolu değil ve bunun olmadığı çeşitli sistemler gördüm, bu yüzden onların iyi bir nedeni olması gerektiğini düşünüyorum. Bu, kullanıcının ~/.bashrckaynaklanmasını beklemeyeceği oturum açma kabukları (örneğin makineye girerken olduğu gibi) çalıştırırken beklenmeyen davranışlara neden olabilir .

Aklıma gelen tek yarar, kullanıcıyı birçok başlangıç ​​dosyasıyla karıştırmamak ve .bashrctek başına düzenlemelerine izin vermek ve kabuk türünden bağımsız olarak bunu okumasını sağlamaktır. Bununla birlikte, giriş yapmak için ve etkileşimli mermiler için farklı ayarlara sahip olmanız genellikle yararlı olduğu için bu şüpheli bir avantajdır ve bu sizi engeller. Ayrıca, giriş kabukları çok sık grafik bir ortamda çalıştırılmaz ve bu dosyalarda ne ayarladığınıza bağlı olarak hatalara ve uyarılara ve sorunlara (oh my!) Neden olabilir.

Peki neden Ubuntu bunu yapıyor, neyi özlüyorum?


Neden -n "$BASH_VERSION"bash dışında gerçek olabilir ki?
Elliott Frisch

@ElliottFrisch olmayacak. Benim sorum niçin .profilekaynaklanıyor .bashrc, bütün Linux versiyonlarında böyle değil ve arkasındaki mantığın ne olduğunu merak ediyorum.
terdon

Debian yukarı akışında bu şekilde uygulanıyor gibi görünüyor .
Elliott Frisch

@ElliottFrisch evet, olmadığını düşündüm ve baktım ve yorumumu düzenlemenin zamanında olduğunu gördüm. Yine de, erişimime sahip olduğum bir SuSe sistemi için geçerli değil (CentOS'ta olmasına rağmen) ve hatırladığım kadarıyla çeşitli sistemlerde (RH'ler, Fedoras, daha eski Ubuntus) durum böyle değildi. Bu yüzden nedenini merak ediyorum.
terdon

Yanıtlar:


15

Bu Debian'dan gelen bir yukarı karar. Bunun mantığı , aşağıdakiler bir alıntı olan bu çok güzel wiki yazısında açıklanmıştır . Yönetici özeti, "GUI ve GUI olmayan girişlerin aynı şekilde çalışmasını sağlamak" şeklindedir:

Örnek olarak xdm alalım. pierre bir gün tatilden geri döndü ve sistem yöneticisinin Debian sistemine xdm kurduğunu keşfetti. Çok iyi oturum açıyor ve xdm .xsession dosyasını okuyor ve fluxbox'ı çalıştırıyor. Yanlış yerel ayarda bir hata mesajı alana kadar her şey yolunda görünüyor! .Bash_profile içindeki LANG değişkenini geçersiz kıldığından ve xdm hiçbir zaman .bash_profile dosyasını okumadığından, LANG değişkeni şimdi fr_CA yerine en_US olarak ayarlanmıştır.

Şimdi, bu sorunun saf çözümü, "xterm" başlatmak yerine, pencere yöneticisini "xterm -ls" başlatmak için yapılandırabilmesidir. Bu bayrak xterm'e normal bir kabuk başlatmak yerine bir giriş kabuğu başlatması gerektiğini söyler. Bu kurulum altında, xterm / bin / bash komutunu gösterir, ancak argüman vektörüne "- / bin / bash" (veya belki de "-bash") koyar, bu nedenle bash bir giriş kabuğu gibi davranır. Bu, her yeni bir xterm açtığında, / etc / profile ve .bash_profile (yerleşik bash davranışı) ve ardından .bashrc (çünkü .bash_profile bunu söylüyor) okur. Bu ilk bakışta iyi görünebilir - nokta dosyaları ağır değil, bu yüzden gecikmeyi fark etmiyor bile - ama daha ince bir sorun var. Ayrıca doğrudan fluxbox menüsünden bir web tarayıcısı başlattı. ve web tarayıcısı, LANG değişkenini şimdi yanlış yerel ayarlara ayarlanmış olan fluxbox'tan devralır. Bu nedenle, xterm'leri iyi olabilir ve xterm'lerinden başlatılan herhangi bir şey iyi olabilirken, web tarayıcısı hala sayfalarını yanlış yerel ayarlarda veriyor.

Peki, bu sorunun en iyi çözümü nedir? Gerçekten evrensel bir tane yok. Daha iyi bir yaklaşım, .xsession dosyasını şunun gibi görünecek şekilde değiştirmektir:

[ -r /etc/profile ] && source /etc/profile
[ -r ~/.bash_profile ] && source ~/.bash_profile
xmodmap -e 'keysym Super_R = Multi_key'
xterm &
exec fluxbox

Bu, .xsession komut dosyasını yorumlayan kabuğun, / etc / profile ve .bash_profile öğelerini okuduklarında, xmodmap veya xterm komutunu çalıştırmadan veya pencere yöneticisini "çalıştırmadan" önce okurlar. Bununla birlikte, bu yaklaşımın olası bir dezavantajı vardır: xdm altında .xsession okuyan kabuk kontrol terminali olmadan çalışır. / Etc / profile veya .bash_profile, bir terminalin varlığını varsayan komutları ("fortune" veya "stty" gibi) kullanırsa, bu komutlar başarısız olabilir. Bu, xdm'nin bu dosyaları varsayılan olarak okumamasının ana nedenidir. Bu yaklaşımı kullanacaksanız, "nokta dosyalarınız" içindeki tüm komutların terminal olmadığında çalıştırılmasının güvenli olduğundan emin olmalısınız.


Hala bunun iyi bir fikir olmadığını düşünüyorum. İdeal olanı, ekran yöneticisinin global bir profil (kontrol) ve kullanıcı kabuğu .profile'yi kaynaklayacağından emin olmak olacaktır . Şimdi neden bazı değişkenlerde çoğaltılmış yollara sahip olduğumu biliyorum ...
Rmano

2

Bu Ubuntu'nun standart davranışıdır, ~/.bashrckullanıcı başına etkileşimli-kabuk başına başlangıç ​​dosyasıdır. Temelde bir terminal açtığınızda , giriş yapmayan, etkileşimli bir kabuk başlatır ~/.bashrcve okunan ve içeriği ~/.bashrcmevcut kabuk ortamınıza aktarılır. Bir kullanıcı tarafından tanımlanan tüm kabuk değişkenlerini ve işlevlerini geçerli kabukta elde etmek için yardımcı olur . Ayrıca bunun gibi satırları da bulabilirsiniz.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Geçerli kabuk ortamında kullanıcı tanımlı takma adları elde etmek için .

Bu, aynı zamanda iyi bir kullanıcı deneyimi sağlamak için önemlidir. Örnek biri için vekil kimlik in depolayabilir .bashrcterminal uygulamaların hiçbiri kaynaklı olsun sürece, ( yani , ping, wget, curl, lynxvb) düzgün çalışacaktır. Veya bir terminal açtığınızda proxy kimlik bilgilerini vermeniz gerekir.

Ubuntu'nun varsayılan ayarları yanında .bashrcbirçok kullanıcı dostu takma ad ( renklendirilmiş çıktı için lsve grepyazdırmak için ), farklı kabuk değişkenleri için kullanıcı deneyimini artıran birçok yeni tanım vardır.

Ancak, ssh giriş bilgileriniz veya sanal konsolda giriş yapmanız durumunda, temelde etkileşimli bir giriş kabuğu alırsınız. Orada kabuk başlatma dosyası var ~/.profile. Dolayısıyla, kaynak olmadıkça, ~/.bashrcayarlarınızdaki tüm yararlı ayarları kaçırırsınız .bashrc. Bu yüzden Ubuntu'nun varsayılan ~/.profilekaynağı~/.bashrc

Kaçınılması gereken dava

  • Eğer kaynak asla ~/.profileformu içini ~/.bashrcaynı zamanda ~/.bashrckaynaklı ediliyor ~/.profile. Sonsuz bir durum döngüsü oluşturacak ve sonuç olarak Ctrl+ tuşuna basmadığınız sürece terminal isteminiz askıya alınacaktır C. Böyle bir durumda, içine bir çizgi koyarsanız~/.bashrc
-x ayarla

Ardından bir terminal açtığınızda dosya tanımlayıcısının durduğunu görebilirsiniz.


Teşekkürler, bu tüm doğru ve faydalı bilgiler. Sadece sorumu ele almıyor. Giriş ve giriş olmayan kabukları arasındaki farkları biliyorum. Benim sorum neden Ubuntu sistemlerinde .profilekaynak bulmaktır .bashrc? SuSe Enterprise 10 bunu yapmaz, kullandığım Fedora sürümlerinden hiçbirini yapmadı, ancak yıllar önce yanıldım. CentOS 5.8 yeterince garipti. Neyse, amacımı gördün mü? Bu bir tasarım tercihi ve neden yapıldığını merak ediyorum.
terdon

Adını yazdığın diğer Linux dağıtımlarını çok fazla kullanmadım. ssh oturumunda içinde .bashrcveya içinde tanımlanmış takma komutlar gibi durumları nasıl ele aldıklarını söyleyebilir misiniz .bash_aliases? Mesela benden ve benim kaynaklardan lsolduğu gibi bir takma ad var . Burada takma adı ssh'den bile kullanabilirim. Veya proxy'yi ssh oturumunda kullanabilirim. Kaynağımı yoksa gelen ben bu özellikleri kaybederler. Bunun daha iyi bir kullanıcı deneyimi olduğunu düşünüyorum. ls --color=auto.bashrc.bashrc.profile.bashrc.profile
souravc

Yapmazlar, bu takma adlar işe yaramaz. Ve evet, kaynak bu .bashrcdüzeltir. Ama aynı zamanda sorunları, ben ne zaman bu garip mesajları almaya devam etti bu davranışı olan bir sistemi kullandık ilk kez hatırlıyorum neden sshben kullanıyordum neden ing xset b offbenim de .bashrcterminali zili devre dışı bırakmak için kullanılan hangi ama sadece bu yüzden bir X sisteminde hata mesajları veriyordu. .bashrcBir giriş kabuğu çalıştırırken okunacağını düşünmedim, çünkü neler olup bittiğini anlamak çok zaman aldı. Sadece bu konuda "resmi" bir açıklama olup olmadığını merak ediyorum.
terdon

Size katılıyorum. Ben de karşı karşıya bazı sorun daha erken . Ancak, aklınızda bulundurmanız ve birkaç özel durumdan kaçınmanız halinde çoğunlukla yararlı ve kullanıcı dostudur. Öyle değil :)
souravc

Evet, bunun geçerli sebepleri var. Canonical'in bu yukarı havza kararını vermek için gerekçesini verip getirmediğini merak ediyordum.
terdon
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.