Uzak Bash neden .bashrc yerine .bash_profile kaynağını kullanıyor?


24

Bash Kılavuzu şöyle diyor:

Bash, uzak kabuk arka plan programı, genellikle rshd veya güvenli kabuk arka plan programı sshd'si tarafından yürütüldüğü gibi, bir ağ bağlantısına bağlı standart girişi ile ne zaman çalıştırılacağını belirlemeye çalışır. Bash'in bu şekilde çalıştırıldığını belirlerse, bu dosya varsa ve okunabiliyorsa, ~ / .bashrc komutlarını okur ve yürütür.

Bu Bash kaynakları ~/.bashrc:

ssh user@host :

Ancak bu Bash kaynakları ~/.bash_profile:

ssh user@host

Spesifikasyona göre bu iki komutta bir fark görmüyorum. Her iki durumda da stdin bir ağ bağlantısına bağlı değil mi?


2
İstediğiniz şey bu olmasa da .bash_profile kaynağından .bashrc kaynağını sağlamanın iyi bir uygulama olduğunu unutmayın . Bu şekilde, bash'nin bir giriş kabuğu veya giriş olmayan bir kabuk olarak başlatılmasından bağımsız olarak .bashrc'den ayarlar uygulanacaktır.
Ilmari Karonen

Yanıtlar:


44

Bir giriş kabuğu önce okur /etc/profilesonra da ~/.bash_profile.

Giriş yapmayan bir kabuk /etc/bash.bashrcve ardından okur ~/.bashrc.

Bu neden önemli?

Bu satırdan dolayı man ssh:

Eğer komut belirtilirse, bunun yerine bir giriş kabuğunun çalıştırmaktadır edilir.

Başka bir deyişle, ssh komutu yalnızca seçeneklere sahipse (bir komut değil), aşağıdaki gibi:

ssh user@host

Bir giriş kabuğu başlayacaktır, bir giriş kabuğu okur ~/.bash_profile.

Bir var bir ssh komutu komutu gibi:

ssh user@host :

Komutun olduğu yerde :(veya hiçbir şey yapmadan).
Bu olacak değil bu nedenle bir giriş kabuğu başlar ~/.bashrcokunacak budur.


Uzaktan stdin

Uzak bilgisayarda / dev / stdin için verilen tty bağlantısı gerçek bir tty veya başka bir şey olabilir.

İçin:

$ ssh sorontar@localhost
/etc/profile sourced

$ ls -la /dev/stdin
lrwxrwxrwx 1 root root 15 Dec 24 03:35 /dev/stdin -> /proc/self/fd/0

$ ls -la /proc/self/fd/0
lrwx------ 1 sorontar sorontar 64 Dec 24 19:34 /proc/self/fd/0 -> /dev/pts/3

$ ls -la /dev/pts/3
crw--w---- 1 sorontar tty 136, 3 Dec 24 19:35 /dev/pts/3

Başlatılan bash görüldüğü gibi hangi bir TTY (bir ağ bağlantısı değil) ile biter.

Komutlu bir ssh bağlantısı için:

$ ssh sorontar@localhost 'ls -la /dev/stdin'
sorontar@localhost's password: 
lrwxrwxrwx 1 root root 15 Dec 24 03:35 /dev/stdin -> /proc/self/fd/0

TTY’lerin listesi de aynı şekilde başlıyor, ancak / etc / profile'nin kaynaklanmadığını unutmayın.

$ ssh sorontar@localhost 'ls -la /proc/self/fd/0'
sorontar@localhost's password:
lr-x------ 1 sorontar sorontar 64 Dec 24 19:39 /proc/self/fd/0 -> pipe:[6579259]

Kabuğa bağlantının bir boru olduğunu söyler (bir ağ bağlantısı değil).

Bu nedenle, her iki test durumunda da, kabuk bağlantının bir ağdan olduğunu ve bu nedenle ~/.bashrc(sadece bir ağ bağlantısı hakkında konuşursak) okumadığını bilemez . ~ / .Bashrc yazıyor, ancak farklı bir nedenden dolayı.


No-arg davası , bir ağ bağlantısına bağlı olan standart girişi ile çalıştırılmaya hak kazanır ve böylece ~/.bashrcokur mu?
Cyker,

@Cyker Kabuğun stdin bir ağa bağlı olacağı varsayılmaktadır . Bunu neden varsayıyorsun? (Cevap düzenlendi, lütfen okuyun).
sorontar

Düzenlenen kısım İlginçtir. Görünen o ki, ssh basitçe bir komut çalıştırırken küçük bir görevle uğraşmaz.
Cyker,

8

Siz “neden” değil “nasıl” diye soruyorsunuz, o yüzden bu açıdan cevap vermeye çalışacağım. Aşağıdakiler, bugün nasıl oldukları ile sonuçlanmak için geçmişte olanların neden gerçekleştiğine dair mantıklı bir fikir olacaktır.


İki farklı başlangıç ​​dosyasına ("profile" ve "rc") sahip olmanın nedeni, geçmişte bir makinede çalışmanın ortak yoluydu:

  1. Bir çeşit gerçek terminalden veya başka bir iş istasyonundan giriş yapın ve bir giriş kabuğu edinin . Bu kabuk kullanıcı ortamını çağıracak /etc/profileve ~/.profileayarlayacaktır.

  2. Kullanıcının girmek istediği ortamı çağır. Bu ortam Xorg olabilir, ancak çoğu durumda GNU ekranı gibi bir çoklayıcıydı.

  3. Ortam (örneğin GNU ekranı) daha sonra ortamı üst giriş kabuğundan miras alan fazladan (oturum açmayan) kabukları çağırır.

Bu, geliştirilmekte cshve bashgeliştirilmekte iken bir UNIX makinesine giriş yapmanın genel yoluydu . Bu nedenle , ~/.profileyine de çevreyi miras alan mermilerde tekrar okumak boşa gitti .

bashdaha sonra ~/.bashrcbu giriş yapma kabukları için ekstra yapılandırma eklendi . csh(ve tcsh) oturum açma kabukları için hiçbir zaman "rc" dosyası eklemeyin. Bu Not csh/ tcsh(POSIX'deki parçası olan) Bourne kabuğu ile uyumlu kabukları değildir iken basholup. Başka bir bourne uyumlu kabuk, tanımlanmamışsa oturum açmayanlar için çalıştırma komutları ("rc") dosyası olarak kullanılacak kshbir ortam değişkeni (adında ENV) eklendi ksh.

Bu yüzden evet, daha yeni bourne kabukları sürümleri, ilave konfigürasyon dosyasını, takma adlar ve GNU ekranı (veya benzeri) tarafından kabartılan kabukları içinde mevcut olacak, ancak ilk girdiğinizde aldığınız kabuğun içinde bulunmayan diğer kolaylık seçeneklerine kolaylık olarak ekledi. makinesi.

Grafiksel ekran yöneticilerinin (GDM'lerin) artmasıyla, "profil" dosyaları ve "rc" dosyaları arasındaki fark, GDM'nin kendi başlatma dosyalarına sahip olacağı için anlamsız hale geldi (örneğin ~/.xinitve ~/.xsession). Daha sonra, GDM içinden belirtilen mermiler, kullanıcının kaprislerine bağlı olarak giriş yapabilir veya giriş yapmayan mermiler olabilir ve giriş yapmayan bir kabuğun her zaman bir giriş kabuğu olan bir ebeveyne sahip olması durumunda artık doğru değildir.

Ekstra

Kabuk başlangıç ​​dosyası karşılaştırması hakkındaki en sevdiğim tablolardan biri, bourne kabuğuna uyumlu kabukları, profilediğer kabukları kullanmıyorken dosyaları nasıl kullandığını gösterir . Bunun nedeni, geçmişte ilk kabuğun (gçlendiriciyi başlatanın) bourne uyumlu bir kabuk olması gerektiğidir.

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.