.Profile'ı bash kabuk betiğinde (unix'te) yeniden yüklensin mi?


130

Bash shell komut dosyası oluşturma konusunda yeniyim ve bir zorlukla karşılaştım. Sadece şunu yaparak ".profile" dosyamı yeniden yükleyebileceğimi biliyorum:

. .profile

ama aynısını yazdığım bir bash senaryosunda çalıştırmaya çalışıyorum ve bu çalışmıyor. Herhangi bir fikir? Açıklığa kavuşturmak için sağlayabileceğim başka bir şey var mı?

Teşekkürler


Ignacio'nun aşağıda işaret ettiği gibi, senaryonuz bir alt kabukta çalışıyor. Alt kabuk, ana kabuğu değiştiremez (alt süreç, üst sürecini değiştiremez). Bu yüzden komut dosyasını "." Kullanarak "kaynak" almanız gerekir. komut ("kaynak" olarak da yazılabilir). Dolayısıyla, komut dosyanız ortam değişkenlerini değiştirmek istiyorsa, "kaynak myscript" veya ". Myscript" gibi bir şey yapmanız gerekir (ikisi de aynı anlama gelir). Bu, ana kabuğunuzun ortamını değiştirecektir. (Bence yapmaya çalıştığın şey bu, eğer yanlışsa bana haber ver.)
bstpierre

1
Cevabımı sorunuzdan aldım :)
Kolob Canyon

Yanıtlar:


195

Mevcut kabuğunuzu yeniden yüklemek için şunu deneyin:

source ~/.profile

1
Alternatif bir çözümünüz var mı? Çünkü sourcekomutu kullanmak dosyayı bir betik olarak çalıştıracaktır ... En kötü durumlarda, birisi MyVar="$foo$MyVar"bash_profile gibi bir değişken ataması kullanırsa, o source ~/.profilezaman sonucu verir MyVar="$foo$MyVar$MyVar", dolayısıyla $MyVardaha sonra yanlış değere sahip olur. (Kötü uygulamalardan bağımsız olarak, alternatif bir çözüm isteyin)
Jeffrey Mvutu Mabilama


5

/ Source ~ / .profile dosyasını yeniden yüklemeye çalışırken birkaç sorun ortaya çıkıyor. [Bu, Ubuntu linux'a atıfta bulunur - bazı durumlarda komutların ayrıntıları farklı olacaktır]

  1. Bunu doğrudan terminalde mi yoksa bir komut dosyasında mı çalıştırıyorsunuz?
  2. Bunu bir komut dosyasında nasıl çalıştırırsınız?

Ad. 1)

Bunu doğrudan terminalde çalıştırmak, alt kabuğun oluşturulmayacağı anlamına gelir. Yani iki komuttan birini kullanabilirsiniz:

source ~/.bash_profile

veya

. ~/.bash_profile

Her iki durumda da bu, ortamı .profile dosyasının içeriğiyle güncelleyecektir.

Reklam 2) Herhangi bir bash betiğini arayarak da başlatabilirsiniz.

sh myscript.sh 

veya

. myscript.sh

İlk durumda bu, sisteminizin ortam değişkenlerini etkilemeyecek bir alt kabuk oluşturacak ve bunlar yalnızca alt kabuk sürecine görünecektir. Subshell komutu tamamlandıktan sonra dışa aktarımların hiçbiri vb. Uygulanmayacaktır. BU ORTAK BİR HATA OLUP BİRÇOK GELİŞTİRİCİNİN ÇOK ZAMAN KAYBETMESİNE NEDEN OLUR.

Komut dosyanıza uygulanan değişikliklerinizin genel ortama etki etmesi için komut dosyasının birlikte çalıştırılması gerekir.

.myscript.sh

Komut.

Betiğinizin bir alt kabukta çalıştırılmadığından emin olmak için bu işlevi kullanabilirsiniz. (Yine örnek Ubuntu kabuğu içindir)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

Umarım bu, bazı yaygın yanlış anlamaları ortadan kaldırır! : D İyi Şanslar!


4

Bash betiği ayrı bir alt kabukta çalışır. Bunun işe yaraması için bu diğer betiği de kaynak olarak vermeniz gerekecek.


Diğer komut dosyasıyla "kaynak" derken tam olarak ne demek istediğinizden emin değilim (tüm bunlar için hala yeni). Lütfen bunu biraz genişletebilir misiniz? Ancak denedim: $. ~ / .profile $. / etc / profile başarılı değil. Çok teşekkür ederim.
Amir Rustamzadeh

1
@amirrustan: Betiğinizin .profiledosyanızı şunun gibi kaynaklaması gerekecek : . $HOME/.profileve betiğinizi de kaynak alarak başlatmanız gerekecek. Gibi bir şey. /path/to/yourscript
sonraki duyuruya kadar duraklatıldı.

1
@amirrustam lütfen okuyun superuser.com/questions/176783/…
lesmana

1

Deneyin:

#!/bin/bash
# .... some previous code ...
# help set exec | less
set -- 1 2 3 4 5  # fake command line arguments
exec bash --login -c '
echo $0
echo $@
echo my script continues here
' arg0 "$@"
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.