.Bashrc bir kabuk betiğinden başarıyla kaynaklanamıyor


51

Normalde ~/.bashrcbu komutu kullanarak kaynak yapabiliriz

source ~/.bashrc

ancak bunu bir kabuk betiğine yazar ve çalıştırırsam hiçbir şey olmaz. Neden?
Bunu yapmanın bir yolu var mı?

Benim betiğim:

#!/bin/bash
chmod a+x ~/.bashrc
source ~/.bashrc

Ayrıca .yerine (nokta) denedim source. Aynı sonuç.

Yanıtlar:


26

Bir kabuk betiği kendi kabuk örneğinde çalıştırılır. Tüm değişken ayarları, işlev tanımları ve bu gibi şeyler yalnızca bu örneği (ve belki de alt öğelerini) etkiler ancak çağrı kabuğunu etkilemez, bu yüzden komut dosyası bittikten sonra giderler.

Aksine, sourcekomut yeni bir kabuk örneği başlatmaz, ancak geçerli kabuğu kullanır, böylece değişiklikler kalır.

.Bashrc'nizi okumak için bir kısayol istiyorsanız, bir kabuk işlevi yerine bir kabuk işlevi veya takma ad kullanın.

alias brc='source ~/.bashrc'

Hızlı cevabınız için teşekkürler. Çözümünüz işe yarayabilir, ancak 'aliac brc = ....' satırını kaydetmek için bashrc dosyasını elle düzenlemek zorundayım. Ortam değişkenini değiştirmek için bir gui geliştirmeye çalışıyorum. Böylece başka bir bilgisayarın bashrc dosyasını elle düzenleyemiyorum.
shantanu

1
Kaçmalısın source ~/.bashrcEğer çevreyi değiştirmek istediğiniz kabuğunda. Başka bir işlemden değiştiremezsiniz. Belki (genel olarak) bu takma adı eklemek GUI'nizin yükleme işleminin bir parçası olabilir.
Florian Diesch

1
alias komutunu daha önce betiğe koyarım ve .bashrc'imi kaynaklamak istediğimde brc'yi çağırır mıyım yoksa bu alias komutunu bir dosyaya koymam gerekir mi?
user137717

Sonunda yaptığım şey, Florian Diesch'in cevabının bir uzantısı. Çok satırlı bir takma ad kullanabilirsiniz: alias brc = 'chmod a + x ~ / .bashrc; kaynak ~ / .bashrc 'Hala oldukça yeniyim, bu yüzden' kötü uygulama 'olarak değerlendirildiğinden emin değilim. Yine de işe yarıyor.
A_user_app

13

Sizin .bashrcgenellikle başlar:

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

Komut dosyanız PS1 kümesine sahip olmadığı için (etkileşimli olmadığı için) yolu erken sıfırladığından sıfırlamaz. Göstermek için, komut dosyanızı değiştirin:

    #!/bin/bash
    chmod a+x ~/.bashrc
    PS1='$ '
    source ~/.bashrc

bu şimdi komut dosyalarınızın yenisiyle çalışmasına izin verir .bashrc. Not: Komut dosyanızdan çıktıktan sonra, env, senaryoyu başlatmadan önceki haliyle ayarlanacaktır. Değişiklikler bir sonraki terminalin başlatılmasında yansıtılacaktır.


En azından 16.04'ten beri ve muhtemelen daha önce, varsayılan Ubuntu .bashrckabuğun etkileşimli olduğunu kontrol etmek için daha güvenilir bir yol kullanır. /etc/bash.bashrchala PS1 testi var.
Zanna

12

Deneyin:

exec bash

Bu ~ / .bashrc, ~ / .bash_aliases, vb. Yeniden yüklemelidir.


9
Bu, mevcut bash işleminin yerine yenisini koyar. Kullanmaktan çok daha kısa veya daha kolay değil sourceancak değişkenleri ve kullanıcının manuel olarak ayarladığı şekilde yok eder;
Florian Diesch

bashrc kaynağından sonra diğer komutların bulunduğu bir Shell betiği bağlamında bekledikten sonra, yeni bash durumuna ihtiyaç duyan komutları bundan sonra da exec bashanlayacağım şekilde daha önce olduğu gibi bash ayarlarında olacak mı?
tatsu

11

Ravi'nin cevabını tamamlamak istiyorum :

Bu davranış, Ubuntu'ya (ve muhtemelen en fazla türetilmiş dağıtımlara) özgüdür, çünkü varsayılan ~/.bashrcdosyanız kısa devre, Ubuntu 18.04 ile başlar, örneğin:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Bu, etkileşimli olmayan bir kabukta çalışıyorsa, tüm komut dosyaları etkileşimli olmayan bir kabukta çalıştırıldığından betiğinizde olduğu gibi dosyanın değerlendirmesini durduracak ve daha sonra sourcebu özelliği devralacaksınız.

eval hile

Ubuntu'yu geçici olarak çözmek için özellikle kullanmak evalyerine çirkin bir saldırı buldum source:

eval "$(cat ~/.bashrc | tail -n +10)"

Sadece birkaç ilk satırı atlar ve geri kalanının değerlendirmesini yapar, ~/.bashrcböylece kalan değerlendirilir ve mevcut yürütmeyi değiştirir.

Sihirli bir sayı olduğunu ve Ubuntu sürümlerinde çalışmayabileceğini unutmayın; fakat az çok bilinen sistemler için betikler hazırlıyorsanız, iyi bir çözüm olabilir.

Bir meraklısı çözümü, değerlendirmeyi durduran belirli bitleri hedeflemek için regex kullanmayı içerebilir.

Shebang alternatif

Bazı senaryolarda daha iyi çalışabilir diğer alternatif bir bayrak ekleyerek interaktif kabuğunda çalıştırmak için komut zorluyor shebang :

#!/bin/bash -i

Birkaç şeyin farkında olun:

  • Öyle daha iyi bir uygulama kullanmak için #!/usr/bin/env bashformu ancak bu yolu argümanlarla kabuğunu başlayamaz .
  • Kullanılması -iyükleyerek, örneğin, sonuçları o kendi kümesi vardır, bunlar arasında, programlar kullanıcı etkileşimi için isteyecektir ve bu genellikle komut dosyaları için tasarlanmamıştır debkomut dosyasını durabilir paketleri dpkg configureister .
  • Başlangıçta bu özelliği kullanmaya set -ive set +iözelliği ihtiyaç duyduğum yerde açıp kapatmaya çalıştım, ancak bu işe yaramadı .

2

Diğer yöntemlerden hiçbiri benim için işe yaramadı ( source /path/to/filevs . ./path/to/file, takma adlar, vb ...), bu eğitim sayesinde , aşağıdakileri kullanarak buldum:

#!/usr/bin/env bash mesele

basit #!/usr/bin/envolanı yerine argümanların tercümana geçmesine izin verir, burada anahtar olduğunu düşünüyorum - daha fazla bilgi için bu belgeye bakın .

Her durumda, herhangi bir formdaki kaynak komutları sizin için çalışmıyorsa, sorununuzu kontrol etmeyi deneyin, sorun bu olabilir :)

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.