Neden hiç .bashrc / .bash_profile dosyasında shebang yok?


22

Basit sorgulama: Bir betiğin üstünde bir shebang görmedim .bashrc, bu da sistemin oturum açtıktan sonra kaynak yazmak için varsayılan kabuğu kullandığını düşünmeme neden oldu ${SHELL}. Neden böyle olduğunu düşünmek istiyorum, yani oturum açma komut dosyasını çalıştırmak için varsayılan kabuk dışında bir şey kullanmak kötü bir alışkanlık olarak kabul edilir.


1
Buna bash rc denmesinin bir nedeni var ...
Ajedi32

Yanıtlar:


28

.bashrcve .bash_profilevardır DEĞİL komut. Her seferinde kaynaklanacak yapılandırma dosyası bash2 yoldan biriyle yürütülür:

  • interaktif
  • oturum aç

Çağırma bash adam sayfasının bölüm neyin en Alakalı olduğunu.

Bir giriş kabuğu bir argümanının ilk karakteri sıfır bir olduğunu -veya başladı bir --loginseçenek.

Bir etkileşimli kabuk bir seçenek olmayan bir argüman olmadan ve başlatıldığından -colan standart giriş ve hata ile belirlenen şekilde, her iki (terminallerine bağlı olan seçenek isatty(3))ya da bir ile başladı -i seçenek. PS1 ayarlanır ve $-içeren ihalinde bashinteraktif, bir kabuk izin veya bu durumu test etmek için bir başlangıç ​​dosyası.

Aşağıdaki paragraflarda bashbaşlangıç ​​dosyalarının nasıl yürütüleceği açıklanmaktadır . Dosyalardan herhangi biri varsa ancak okunamıyorsa, bash bir hata bildirir. Ekler , GENİŞLETME bölümünde yer alan Tilde Genişletme bölümünde açıklandığı şekilde dosya adlarında genişletilmiştir .

Bash etkileşimli bir giriş kabuğu veya --loginseçenekle etkileşimli olmayan bir kabuk olarak çağrıldığında , ilk önce dosyadan komutları okur ve yürütür /etc/profile, eğer o dosya varsa. Bu dosyayı okuduktan sonra, arar ~/.bash_profile, ~/.bash_loginve ~/.profile, bu sırayla ve okur ve var ve okunabilir olanlarını gelen yürütür komutları. --noprofileKabuk bu davranışı engellemek için başlatıldığında seçenek kullanılan olabilir.

Bir giriş kabuğu çıktığında, bash ~/.bash_logouteğer varsa dosyadaki komutları okur ve yürütür .

Bir zaman interaktif bir oturum açma kabuğu başlatılır değil kabuk, bash okur ve yürütür komutları gelen ~/.bashrc, bu dosya varsa. Bu --norcseçenek kullanılarak engellenebilir . Bu --rcfile file seçenek bash'ı komut yerine dosyadan komutları okumaya ve yürütmeye zorlayacaktır ~/.bashrc.

Komut satırı anahtarları aracılığıyla ne zaman yüklendiklerini kontrol edebilirsiniz --norcve --noprofile. --rcfileDüğmeyi kullanarak yüklendikleri yerin yerini de geçersiz kılabilirsiniz .

Diğerlerinin de belirttiği gibi, bu dosyaların source <file>komut kullanımı veya komut kullanımı ile nasıl yüklendiğini taklit edebilirsiniz . <file>.

Bu işlevi aşağıdaki gibi düşünmek en iyisidir:

  1. bash çıplak bir çevre ile başlar
  2. bash daha sonra bu dosyalardan birini açar (etkileşime veya giriş olarak nasıl çağrıldığına bağlı olarak ve ardından ...
  3. ... satır satır dosya içindeki komutların her birini çalıştırır ...
  4. tamamlandığında bilgi istemi şeklinde kontrol edildiğinde, giriş bekleniyor

Çağırma yöntemleri

Bu konu, her seferinde bir kez ortaya çıkıyor gibi gözüküyor, işte çağırmanın çeşitli yollarını bashve neyle sonuçlandıklarını gösteren küçük bir sayfa. NOT: "kaynaklı $ HOME / .bashrc kaynaklı" ve "kaynaklı $ HOME / .bash_profile "kendi dosyalarına.

temel aramalar

  1. bash

    $ bash -i
    sourced /home/saml/.bashrc
    
  2. bash -l

    $ bash -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    
  3. bash -il -ve- bash -li

    $ bash -il
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    
  4. bash -c "..cmd .."

    $ bash -c 'echo hi'
    hi
    

    NOT:-c Anahtarın herhangi bir dosyayı kaynaklamadığına dikkat edin !

config dosyalarının okunmasını engelleme

  1. bash --norc

    $ bash --norc
    bash-4.1$ 
    
  2. bash --noprofile

    $ bash --noprofile
    sourced /home/saml/.bashrc
    
  3. bash --norc -i

    $ bash --norc -i
    bash-4.1$ 
    
  4. bash --norc -l

    $ bash --norc -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    
  5. bash --noprofile -i

    $ bash --noprofile -i
    sourced /home/saml/.bashrc
    
  6. bash - noprofile -l

    $ bash --noprofile -l
    bash-4.1$ 
    
  7. bash --norc -i -ve- bash --norc -l

    $ bash --norc -c 'echo hi'
    hi
    

Bash çağırmanın daha ezoterik yolları

  1. bash --rcfile $ HOME / .bashrc

    $ bash -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    
  2. bash --norc --rcfile $ HOME / .bashrc

    $ bash --norc -rcfile ~/.bashrc 
    bash-4.1$ 

Bunlar başarısız

  1. bash -i -rcfile ~ / .bashrc

    $ bash -i -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: /home/saml/.bashrc: restricted: cannot specify `/' in command names
  2. bash -i -rcfile .bashrc

    $ bash -i -rcfile .bashrc
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: .bashrc: command not found

Muhtemelen daha fazlası var ama umarım ...

Başka?

Son olarak, bu konuyla ilgili daha fazla okumak / keşfetmek istediğinizden çok etkilendiğiniz takdirde, Başlayanlar Kılavuzuna, özellikle bölüm: 1.2'ye bir göz atmanızı şiddetle tavsiye ederim . Bourne'nun Avantajları Yine Kabuk . Bunun altındaki çeşitli alt bölümler "1.2.2.1. Çağırma" ile "1.2.2.3.3. Etkileşimli kabuk davranışı" , çağırabileceğiniz çeşitli yollar arasındaki düşük seviye farklarını açıklar bash.


@amphibient - özür dilerim biraz elinden çıktı, umarım insanlar değerini takdir eder ve puanları düşürmez. Bununla burada, şimdi yolun aşağısındaki diğer cevaplarla referans alabiliriz. 8-). Bunu göstermek için bir masa yapmayı düşünüyordum ama bu çılgınca olurdu 8-).
slm

Bunları gerçekten test ettin mi? Bir keresinde benim
baslığımın sıkışmada

@Bananguin - bu komutların her biri benim tarafımdan çalıştırıldı ve komutların altında üretilen çıktı. Kurulumumla ilgili tek potansiyel "şey" benim .bash_profilekaynağım için bir satır içermesi olabilir .bashrc. Ancak bunun çok tipik kurulumlar olduğuna inanıyorum.
slm

Bu öznel olabilir, ama bunu söylemezdim .bashrcve .bash_profilesenaryolar değil . IMHO, bash başlatma sırasında dolaylı olarak veya değişikliklerini uygulamanız gerektiğinde açık bir şekilde kaynaklanan özel amaçlı komut dosyalarıdır. Yapılandırma dosyalarından beklendiği gibi sadece bash ortamını (değişkenler, fonksiyonlar, takma adlar ...) yapılandırmazlar. Ortak komut dosyalarında olduğu gibi herhangi bir işlemi yapabilirler. Örneğin, arka plan görevleri, günlük kayıtları yazma, bazı programları başlatma vb. Gibi çeşitli eylemleri başlatabilirler. Yine de ayrıntılı özet için teşekkür ederiz!
pabouk 09

Bu cevap burada verilen cevaplardan daha iyi. Stackoverflow.com/questions/415403/… !
Jacob Tomlinson,

13

.bashrckomut dosyaları yalnızca bashkendi başına çalıştırılır . Serbest execdurmazlar ve sistem tarafından yönlendirilmeleri amaçlanmamıştır . (Aslında, bunlar genellikle çalıştırılabilir olarak işaretlenmezler ve dediğiniz gibi bir shebang çizgisi yoktur.)

Bu gibi betiklerin sourced olması amaçlanmıştır , çünkü genellikle $PATHbetik bittikten sonra da kalması beklenen ortam değişkenlerini değiştirme ( örneğin) gibi şeyler yaparlar . Bu yüzden, birini alt kabukta çalıştırmaya çalışmak gerçekten anlamsız olurdu.


5

Diğer cevaplara ek olarak, eğer isterseniz, hiçbir şey bu yapılandırma dosyalarının başına bir shebang koymanıza izin vermeyeceğini unutmayın.

Shebang'ın normal bir yorum gibi işleneceği, yani görmezden gelindiği için bu durum onları zorlamadı.

Bu, dosyada hangi programlama dilinin kullanıldığını bulmak için sözdizimi vurgulaması kullanan editörlere yardımcı olabilir.

Bazı editörlerin vim, ikincisi için modellemeler gibi alternatif yollar sunduğunu unutmayın . yani her zaman ~/.bashrcve ~/.bash_profilebenzerlerinin sonuna her zaman mod satırları koyabilirsiniz :

...
<code in ~/.bashrc>
...
# vim: ft=sh :

1
Yukarıdaki slm tarafından kabul edilen cevap harika, ama bu, .bash_profileShellCheck'in tavsiyesi üzerine bir shebang eklemek için aradığım şeydi.
jlucktay

1

Bunu her yerde okudum tam olarak nerede olduğunu bilmiyor ama doğru

Bash kılavuzu bu alanda biraz kafa karıştırıcıdır, ancak Bash bir kabuk betiği gibi ~ / .bash_profile komutunu kullanmaz. Dosyayı okur ve içindeki komutları çalıştırır (~ / .bash_profile dosyasını çalıştırarak benzer bir şey yapabilirsiniz).

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.