.Bashrc ve .bash_profile öğelerini anlama


26

Bir sunucuda root olarak giriş yaptığımda görüyorum .bashrc(Ubuntu 10.10).

Mac'imde bir .bash_profile

Ubuntu her zaman sadece bir .bashrcdosyaya sahip .bash_profilemidir? (Sadece kafam karıştı, bu yüzden soruyorum, farklı o / lar olduklarının farkındayım ama belki bir şekilde bir ilişki vardır?)

Sunucumda bir takma ad oluşturmak istiyorum, içine koymalı .bashrcmıyım?

Tüm kullanıcıların kullanabilmesi için bu diğer adın uygulanmasını istersem ne olur?


1
muhtemelen yinelenen: askubuntu.com/questions/1528/bashrc-or-bash-profile - Sorunuzu yalnızca takma adın global olarak nereye yerleştirileceğini sormak için değiştirmenizi öneririm.

Yanıtlar:


39

Bash takma adları , tek tek ev dizinlerindeki dosyalara .bash_aliasesveya .bashrcdosyalara girmelidir . Eğer global bash takma isimleri oluşturmanız gerekiyorsa, içeri girebilirler /etc/bash.bashrc, ancak yeni oluşturulan kullanıcılar tarafından miras almaları için dosyalara .bash_aliasesveya .bashrcdosyalara eklemek genellikle en iyisidir /etc/skel.

Öyle hemen hemen her zaman yanlış içinde bir takma ad tanımlamak için .profile, .bash_profileya da /etc/profile.

Nedenini anlamak için , bu dosyaların her birinde hangi koşullar altında komutların çalıştırıldığını anlamak gerekir . Aşağıda ele aldığım bu konuda yanlış anlamalar var.

Birden fazla kullanıcı için takma ad tanımlamak istemeseniz de, bireysel kullanıcılar için nasıl tanımlandıklarını bilmelisiniz, böylece ihtiyacınız olan en iyi yöntemi seçmeye karar verebilirsiniz.

Bireysel Kullanıcılar için Takma Adlar

Özellikle bir GUI kullanıyorsanız, etkileşimli mermilerinizin çoğu muhtemelen giriş yapmayan mermilerdir. Hiçbir zaman bir GUI kullanmasanız bile, muhtemelen hala bazı sıklıklarda oturum açma kabukları kullanmıyorsunuzdur . Takma adlarınızın bu kabuklarda çalışmasını istersiniz.

Özellikle grafiksel olmayan bir sanal konsolda veya SSH üzerinden giriş yaparsanız, muhtemelen bazı durumlarda oturum açma kabukları kullanırsınız. Böylece takma adlarınızın etkileşimli giriş kabukları içinde çalışmasını istersiniz.

Etkileşimli, giriş yapmayan bir kabuk başladığında , .bashrckullanıcının giriş dizininden kaynaklanır . Ubuntu'da varsayılan olarak , varsa , her kullanıcının .bashrckendisi kaynaklarıdır .bash_aliases.

  • To kaynağı bir dosya içeriği çalışmasına neden olmaktır akım kabuk. Kaynaklı bir dosyada yapılan kabuk ortamındaki değişiklikler, dosyadaki tüm komutlar çalıştırıldıktan sonra bile devam eder.

Ubuntu'nun varsayılan yorumları okurken .bashrco olduğunu ortaya koymaktadır resmen amaçlanan diğer adlar koyulması .bashrcveya .bash_aliases. .bashrcZaten bazı takma ad tanımları ( grep '^[[:blank:]]*alias' ~/.bashrcbunları görmek için çalıştırın ) içerir ve yeni tanımları nereye koyacağınız konusunda açık bir tavsiye sunar:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

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

Peki etkileşimli giriş kabukları ne olacak ? Bunun yerine .bashrc, giriş kabukları kaynağı .profile.

  • ... Var .bash_loginolmadığı sürece , onun yerine kaynaklanır.
  • ... Var .bash_profileolmadığı sürece , onun yerine kaynaklanır.

Ancak, iyi haber Ubuntu varsayılan olarak, yani içinde komutlar .bashrcolacak da etkileşimli giriş kabukları çalıştırmak varsayılan çünkü .profileşimdiki kabuk bash olup olmadığını kontrol eder (ve eğer .bashrcmevcutsa) ve eğer öyleyse, kaynakları .bashrc:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Kullanıcıların .bash_aliasesana dizinlerinde yeni bash takma adları tanımlamasını öneririm (önceden mevcut değilse oluşturma). Bu, takma ad tanımlarını kullanıcı başına kalıcı hale getirmek için özellikle temiz ve basit bir yoldur.

Takma adlar gerekir değil tanımlanmalıdır.profile onlar dışı giriş kabukları içinde tanımsız kalır çünkü. Bir bash kabuğunun ortamının çok farklı olarak, diğer adlar vardır değil çocuk kabukları ihraç:

ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found

Özellikle, varsayılan olarak çoğu masaüstü ortamı .profilegrafiksel oturum açmadan kaynaklanır, ancak:

  1. Bu mutlaka bir bash kabuğu tarafından yapılmaz, bu nedenle diğer ad tanımları bile işlenmeyebilir ve daha da önemlisi
  2. Diğer ad tanımları işlense bile, alt işlemlere geçirilmez . Özellikle, bir Terminal penceresi açılarak oluşturulan mermilere geçmezler!

Takma adlar .bash_profile(veya .bash_login) içinde aynı nedenle tanımlanmamalı, aynı zamanda başka bir nedenle de tanımlanmalıdır. Doğal olarak bu dosyalardan birini oluşturmak ve sadece takma ad tanımlarını koymak , kodun .profileçalışmasını engeller !

Yararlı .bash_profileveya .bash_logingerçekten yararlı olduğu durumlarda , tipik olarak içlerinde bir .profileyerde bir kaynak bulunur ve bu problemi çözer. (O zaman geriye kalan tek sorun, .profileiçerisinde takma ad tanımlamak .bash_profileveya .bash_logindoğru çalışmadığıdır.)

İçin adlar Yeni Otomatik Bireysel Kullanıcılar,

Gerçek bir insanı temsil etmeyi amaçlayan türde bir kullanıcı hesabı oluşturulduğunda, tipik olarak ana dizini olarak kullanılmak üzere yeni bir dizin oluşturulur. İçeriği /etc/skeldaha sonra ana dizine kopyalanır. Birden çok kullanıcının kendi dizinlerindeki bazı benzer yapılandırma dosyalarıyla başlaması bu şekildedir. Ubuntu, bu içerir .profile, .bashrcve diğer bazı dosyaları.

Yeni kullanıcılar için hangi takma adların tanımlandığını değiştirmek için basitçe onları /etc/skel/.bash_aliases(oluşturmanız gerekir) yerleştirebilirsiniz /etc/skel/.bashrc.

Zaten var olan bir dosyayı düzenlerseniz, önce /etc/skelonu yedeklemek isteyebilirsiniz - ancak yedeği koymamanız gerekir /etc/skel, yoksa onu da yeni kullanıcıların ana dizinlerine kopyalarsınız.

Bu, birden fazla kullanıcı için yeni takma ad eklemeniz için en iyi yoldur. Mevcut kullanıcılar takma adları kendileri ekleyebilir. Takma adları tanımlarsanız, /etc/skel/.bash_aliasesbasitçe onları kendi dizinlerine kopyalamayı seçebilecekleri bir dosyaya yönlendirebilirsiniz (veya kendi özel .bash_aliasesdosyalarına ekleyin ).

Bir kullanıcının takma adı tanımlaması çok önemlidir. Ek olarak, diğer adlar son derece sağlam değildir ; sadece belirli durumlarda çalışırlar. Sürekli çalışan yeni bir komut oluşturmanız gerekirse, herkes için bu komutu bir diğer ad olarak uygulamamalısınız. Ayrıca, takma adları istemeyen kullanıcılara başarıyla zorlayamazsınız - basitçe onlar yapabilir unalias.

Tüm Kullanıcılar İçin Global Takma Adlar

Ben bu yaklaşımı önlemek için tavsiye rağmen, olabilir de takma adları tanımlayan küresel /etc/bash.bashrc dosyası. Ardından hem etkileşimli oturum açma olmayan kabuklar hem de etkileşimli oturum açma kabukları için tanımlanacaktır. Nedeni, daha önce kullanıcının ana dizindeki dosyaların herhangi kaynaklıdır:

  • Giriş kabukları (ve sadece giriş kabukları ve giriş kabukları gibi davranan diğer işlemler) /etc/profileotomatik olarak komutları çalıştırın .
  • Yalnızca oturum açma kabukları /etc/bash.bashrcotomatik olarak komutları çalıştırmaz , ancak
  • Ubuntu'nun varsayılanı /etc/profile, çalışan kabuğun bash olup /etc/bash.bashrcolmadığını (ve varsa) ve varsa kaynak olup olmadığını kontrol eder /etc/bash.bashrc.

Kabuk bash ise ( .profilekullanıcı .bashrcyukarıda açıklandığı gibi) varsayılan kullanıcı başına kullanıcı başına nasıl kaynaklandığına benzer .

İşte bunun için gerçek kod varsayılan olarak şöyle görünür /etc/profile:

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

Bu blok diğer görevleri de yerine getirir. Spesifik olarak, dış ifkabuğun etkileşimli olup olmadığını kontrol eder (bilgi istemi metninin boş olmadığını kontrol ederek), ardından mevcut kabuğun bash olup olmadığını kontrol eder ve kaynak /etc/bash.bashrcolup olmadığını ve bazı işler yapmazsa, , zaten yapıldı /etc/bash.bashrc.

Sen gerektiğini değil küresel adlar tanımlamak /etc/profileaynı nedenle kullanıcıların kendi yerel onları tanımlamak gerekir için .profiles: bunu yaparsanız, onlar çocuklarının kabukları için sadece giriş kabukları için tanımlanan ve edilmeyecektir.

Son olarak, varsayılan kullanıcı başına farklı olarak, .bashrcvarsayılan /etc/bash.bashrcdosyanın takma adlarla ilgili hiçbir şey içermediğine dikkat edin. Kullanıcılara, takma adlarını düzenleyemeyecekleri veya devre dışı bırakamadıkları bir dosyada takma ad vermek biraz alışılmadık bir durumdur. (Elbette, hala edebilirsiniz kendi yerel onların tanımları geçersiz kılarak, bunu .bashrc, .bash_aliasesbaşka yerde ya.)

Daha fazla okuma


5

İşte bazı güzel okumalar . ".bash_profile oturum açma kabukları için yürütülürken, .bashrc etkileşimli oturum açma olmayan kabukları için yürütülür"

Bu nedenle, takma adınız için .bash_profile komutunu kullanın.


4
Takma adları koymak .bash_profiledoğru değil. Ubuntu'da, .profile(oturum açma kabukları için çalışan) .bashrcetkileşimli bir bash kabuğu olduğunda kaynaklar . Böylece takma adların .bashrc(veya .bash_aliaseskaynakların içine yerleştirilmesi .bashrc) tüm etkileşimli bash kabuklarında onları tanımlar . Takma adlar , diğerleri arasında, bu problemi.bash_profile verir . Bkz bu , o , benim cevap ve varsayılan var orada ya koyarak takma adları tavsiye yorumlar . ~/.bashrc.bash_aliases
Eliah Kagan
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.