Oturum açma kabukları için neden / etc / profile kullanılmıyor?


51

Giriş ve giriş olmayan kabuk şöyle tanımlanır:

su - $USER # will give you a login shell
bash # will give you a non-login shell

Konsole (kde) başladığınızda olduğu gibi oturum açma kabukları için / etc / profile çağrılmaz. / etc / profile, sadece oturum açma kabukları için çağrılır.

Neden? Lütfen açıklayın, çünkü bunun mantığını anlamayı seviyorum.

Yanıtlar:


99

/etc/profile Özel giriş amacı olduğu için sadece oturum açma kabukları için çağrılır.

Eğer bir komut olan etkileşimli kabuklarda çalıştırmak isterseniz değil kabukları giriş ve kullandığınız bash, koyun ~/.bashrcveya /etc/bash.bashrc.

"Profil" dosyalarının amacı sadece giriş kabukları için çalıştırılması gereken komutları içermektir. Bu dosyalar:

  • /etc/profileBir giriş kabuğu olarak başlatıldığında, tüm Bourne uyumlu mermiler ( bashve dahil dash) tarafından çalıştırılır .

  • Scriptler içeri /etc/profile.d.

    Bu Bourne tarzı mermiler içindir, ancak kabuğun çalıştırılabilir koduna kodlanmamıştır. Aksine, komutları /etc/profileonları çağırır. Örneğin, Ubuntu 12.04 sistemimde /etc/profileşu satırları içerir:

    if [ -d /etc/profile.d ]; then
      for i in /etc/profile.d/*.sh; do
        if [ -r $i ]; then
          . $i
        fi
      done
      unset i
    fi
    
  • .profile Kullanıcının giriş dizininde, giriş kabuğu olarak başlatıldığında Bourne uyumlu kabuklar tarafından çalıştırılır (geçersiz kılmadıkça aşağıya bakın).

  • .bash_profileveya .bash_loginkullanıcının giriş dizininde. Bunlar dışındaki kabuklar tarafından yoksayılır bash. Fakat .bash_profilevarsa, yerinebash onu çalıştırır . Eğer yoksa ama varsa, bunun yerine çalıştırılır . .profile.bash_profile.bash_login.profile

    (Ancak , açık bir şekilde * arayacak şekilde yazılması için .bash_profileveya .bash_loginvar olduğunda yaygındır .profile.)

    Kabuğa özgü profil dosyalarının yararı , yalnızca o kabuk için geçerli olan komutları veya sözdizimlerini içerebilmeleridir. Örneğin, [[değerlendirme operatörünü .bash_profile/ içinde kullanabilirim, .bash_loginancak kullanırsam .profileve sonra kabuğum dasholarak giriş yaparsam başarısız olur.

"Profil" Dosyaları İçinde Neler Olmalı

"profile" dosyaları giriş başında sadece bir kez çalıştırılması gereken komutları içermelidir. (Bu, aynı zamanda bir oturum açma kabuğu ile başlayan grafiksel girişleri de içerir.) Bir kabuk etkileşimli ise, çalışan kullanıcı muhtemelen oturum açar ve bu nedenle büyük olasılıkla bir atası vardır (bu, onu başlatan veya başlatanı başlatır, veya bunu başlattım, vb.) bu bir giriş kabuğu idi.

Bir komutu yalnızca bir kez çalıştırmak isteyebilirsiniz çünkü:

  1. Giriş başına birden fazla kez çalıştırmak için hiçbir neden yoktur, bu verimsiz veya
  2. Giriş başına bir kereden fazla çalıştırmak, istenmeyen bir sonuç üretecektir.

İstenmeyen bir sonucun ortaya çıkacağı ikinci durumun bir örneği olarak, her kullanıcının varsayılan olarak görünen bu satırları göz önünde bulundurun ~/.profile:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

SSH’nin içeri girdiğini varsayalım, başka bir kabuk koştum (diyelim zsh), bir noktada geçici olarak geri gitmek istediğinizi bashancak çevrenizi tutmak istediğinizi (içeri bashgirerken tekrar koştum zsh) ve daha sonra mcda kabuğunu parça gibi çalıştıran bir program çalıştırdığınızı varsayalım. Arayüzünün. Eğer binev klasörüne mevcut olan ve kullanıcı adı james, senin PATHen içteki kabuk gibi bir şey:

/home/james/bin:/home/james/bin:/home/james/bin:/home/james/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Bu verimsiz ve (daha da önemlisi) içeriğini anlamayı zorlaştırıyor PATH.

Bu, hiçbir şekilde bir felaket değildir. Söyleyebileceğim kadarıyla, her etkileşimli kabuk "profil" dosyalarından kaynaklanırsa , varsayılan yapılandırmada hiçbir şey olmazdı . Bununla birlikte, "profil" dosyalarının amacı giriş başına sadece bir kez çalıştırılacak komutlar içerdiğinden , bir kullanıcı veya yönetici bir profile yalnızca giriş kabuğu başlatırken çalıştırması gereken komutlar ekleyebilir .

Çalıştırılacak Her Etkileşimli Kabuğun Komutlarını Nereye Koymalı?

Kullanıyorsanız bash, her etkileşimli kabukta çalıştırılacak olan komutlar için dosyalar vardır:

  • /etc/bash.bashrc
  • .bashrc kullanıcının ana dizininde.

Bu en çok kullanılan komutlar için kullanılır.

  1. sadece koştukları kabuğun çevresini etkiler - çocuk mermileri bile değil veya
  2. Bu giriş kabuğu olmasa bile çalışması gerekir.

Örneğin, komut satırı sekmesi tamamlama genellikle bashoturum açma kabuğu olup olmamasına göre etkinleştirilmelidir . Yani bu görünür ~/.bashrc:

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

Orada, 1 ve 2 her ikisi de geçerlidir: bu, bunun içinde çalıştırılan diğer kabuklara taşınmaz ve bashfarklı bir kabukla giriş yapmış olsam bile , sekme tamamlama çalışması gerekir .

Giriş Kabukları ve Etkileşimli Giriş Kabukları için Komutları Nereye Koymalı

bashOturum açma kabukları ve etkileşimli kabukları çalıştırmak ve oturum açma kabukları olmayan bir komut kullanıyorsanız ve kullanmak istediğinizde , /etc/bash.bashrcya da içine koymak genellikle yeterlidir~/.bashrc . Bu, varsayılan olarak, çünkü, /etc/profileve ~/.profilebunları açıkça çalıştırın. Örneğin, ~/.profilevar:

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

(Benzer şekilde, /etc/profilekaynaklar /etc/bash.bashrciçin bash).

Bu nedenle, hem "profil" hem de "rc" dosyaları etkileşimli bir bashkabuk başlattığınızda çalışır (bir giriş kabuğu olsun ya da olmasın).

Etkileşimli Olmayan Kabuklarda Çalıştırılacak Komutları Nereye Koymalı?

Muhtemelen etkileşimli olmayan tüm mermilerin çalışması için herhangi bir komut belirtmek istemezsiniz; bir betiğin her çalıştırılışında çalışırlar (betiğin onları çalıştırmak için yapılandırdığınız kabuk tarafından çalıştırılması şartıyla).

Bu önemli ölçüde kırılmaya neden olabilir. Bunu yapacaksanız ve sistemde kullandığınızdan başka bir yönetici hesabı yoksa, bir tane oluşturmak isteyebilirsiniz; bu hataları düzeltmeyi kolaylaştırabilir.

İçinde bash"rc" dosyaları aslında kabuk etkileşimli olsun olmasın çalıştırılır . Ancak, tepede diyorlar ki:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Bu nedenle, komut dosyalarını çalıştırmak için çalışanlar gibi etkileşimli olmayan kabuklarda bile otomatik olarak çalışan komutlara ihtiyacınız varsa, komutlarınızı bu satırların önüne ekleyebilirsiniz .

Giriş Kabuğunu Başlatma

Giriş yapmak bir giriş kabuğu başlatır. İsterseniz o, bir giriş kabuğu gibi davranmasına ile başlamak sonra bir kabuk başlatılan -lbayrak (açılımı l OGIN ). Örneğin:

Bu, başka bir kullanıcı olarak başlatmak istemediğiniz sürece bir giriş kabuğu başlatmanın (giriş yapmadan) en iyi yoludur . Sonra kullan:

  • sudo -iiçin root( sudo -sgiriş yapmayan, etkileşimli bir kök kabuğu için kullanın)
  • sudo -u username -i herhangi bir kullanıcı için
  • su - usernameolmayan için rootkullanıcılar (kullanım dışı bir giriş, etkileşimli kök kabuğu için)su username

Bir nedir başlangıçtaki giriş kabuğu?

Bir ilk giriş kabuğu bir aynıdır giriş kabuğu . Her yerde bu cevap "giriş kabuğu" diyor, "başlangıç ​​giriş kabuğu" diyebilir (bu bölüm dışında, zaten anlam ifade etmeyecekti).

Başlangıçta oturum açma kabuğu teriminin bir nedeni , oturum açma kabuğunun ayrıca oturum açarak yürütülen kabuk olarak hangi programın kullanıldığını belirlemek için farklı bir şekilde kullanılmasıdır. Söylemek için kullanılan giriş kabuğu duygusu :

Daha fazla okuma


4
Herhangi bir Stack Exchange sitesindeki herhangi bir sorunun en iyi cevaplarından biri.
Mark E. Haase

1
> "profile" dosyaları giriş sırasında sadece bir kez çalıştırılması gereken komutları içermelidir. (Bu, aynı zamanda bir giriş kabuğu ile başlayan grafiksel girişleri de içerir.) Hayır, hayır, hayır, hayır! Kesinlikle değil! Tüm burne benzeri kabuklar, etkileşimli giriş kabuğu oturumlarında yalnızca .profile dosyasını , yani ya -i seçeneğiyle başlayanları ya da kontrol terminaline bağlı olanları (kabuk bir ekran yöneticisi tarafından başlatıldıysa ikisi de geçerli değildir) okur . Bunun doğru olmasının nedeni, bu dosyanın amacı sadece ortamlarını değil , kullanıcının terminalini ayarlamaktır . Bir görüntü yöneticisi tr

Eliah, Derek'in yorumunun geri kalanını burada çoğalttım, ancak yukarıdaki güdükten ayrıldım, böylece itibar gereklilikleri nedeniyle buna cevap veremese de cevap bildiriminizi alacak. Bununla birlikte, yukarıdaki sohbet odasına yazma izni verdim.
Seth

1
In bash, the "rc" files are actually run whether the shell is interactive or not. yanlış. /etc/bash.bashrc /etc/bash.profile tarafından tetiklenir.
okwap

okwap haklı, rc dosyaları etkileşimli olmayan bir kabuğa çağrılmıyor, bu daha özlü ve doğru.
Nick Allen
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.