Bash_profile veya bashrc? De ortam değişkenleri?


36

Bu soruyu buldum [blog]: .bashrc ve .bash_profile arasındaki fark çok yararlı, ancak en çok oyu alan cevabı gördükten sonra (bu arada çok iyi) başka sorum var. En çok oy alanın sonuna doğru, doğru cevabı şöyle ifade ediyorum:

Burada görebileceğinize ve ortam değişkeni tanımlarını ~ / .bashrc biçiminde koyma ya da terminallerde her zaman oturum açma kabukları başlatma önerileri olduğunu unutmayın. Her ikisi de kötü fikirler.

  1. Neden kötü bir fikir (savaşmaya çalışmıyorum, sadece anlamak istiyorum)?

  2. Bir ortam değişkeni ayarlamak ve onu PATH'e (örneğin JAVA_HOME) eklemek istersem, dışa aktarma girişini koymak için en iyi yer neresidir? içinde ~ / .bash_profile veya ~ / .bashrc ?

  3. 2. soruya verilen cevap ~ / .bash_profile ise , iki sorum daha olacak:

    3.1. ~ / .Bashrc altına ne yazardın ? sadece takma adlar?

    3.2. Giriş yapmayan bir kabuğa, ~ / .bash_profile dosyasının "alınmadığına" inanıyorum . JAVA_HOME girişinin dışa aktarımı bash_profile'de olsaydı javac & java komutlarını çalıştırabilir miyim? Onları PATH'ta bulur mu? Bazı yayınların ve forumların JAVA_HOME ve benzeri ayarları ~ / .bashrc olarak ayarlamayı önermesinin nedeni bu mu?

    Şimdiden teşekkürler.

Yanıtlar:


26

Modern bir sistemde, önemli olduğu davalara rastlamak yaygın değildir, fakat olur. (Özellikle, satır içi formdaki vimgibi kabuk işlemlerini kullanırsanız .):r !command!<motion>command

~ / .Bashrc altına ne yazardın? sadece takma adlar?

~/.bashrcOtomatik olarak alt kabuklar tarafından miras alınmayacak şeyleri koyarsınız ; bu, takma adlar ve işlevler anlamına gelir, ancak bazen kabuğun dışında görünmesini istemediğiniz değişken ayarlara sahip olsanız da (bu çok nadir görülür). Bunların bir şekilde ihraç edilmesi gerektiği iddia edilebilir, ancak çeşitli deneysel girişimler onları çevreye gizlemeye çalışmakla uyumluluk sorunlarıyla karşı karşıya kalmış ve çoğunlukla terk edilmiştir.

Bir ortam değişkeni ayarlamak ve onu PATH'e (örneğin JAVA_HOME) eklemek istersem, dışa aktarma girişini koymak için en iyi yer neresidir? ~ / .bash_profile veya ~ / .bashrc?

Ortam ayarlarını, ~/.bash_profileakıllıca başlangıç ​​ayarları almaları için yerleştirin. Bazen bunları geçersiz kılmak isteyeceksiniz (genellikle bu, Matlab veya Cadence gibi karmaşık ortamlar tarafından yapılır); Ortam ayarlarını yaparsanız, ~/.bashrco zaman bu ortamların içinden geçen mermiler, ortamın özelleştirmelerini kaybeder ve sonuç olarak işler düzgün çalışmayabilir. Bu , birden fazla geliştirme ortamını yönetmek için modüller , virtualenv , rvm , vb. Gibi bir paket kullanırsanız da geçerlidir ; ayarlarınızı koymak, ~/.bashrcistediğiniz ortamı editörünüzden çalıştıramayacağınız anlamına gelir, bunun yerine sistem varsayılanına zorlanacaktır.

Giriş yapmayan bir kabuğa, ~ / .bash_profile dosyasının "alınmadığına" inanıyorum.

Doğru; normalde ilk kabuğun bir giriş kabuğu olmasını istersiniz ve bunun altında başlayan herhangi bir kabuğun giriş kabukları olmamasını istersiniz . İlk kabuk bir giriş kabuğu değilse, varsayılan PATHveya çeşitli başka ayarlara ( JAVA_HOMEörneğin dahil ) sahip olmazsınız .

Ekran yöneticilerinden başlatılan çoğu masaüstü ortamı (yani, grafiksel girişlerin büyük çoğunluğu) tüm masaüstünde bir giriş ortamı oluşturmaz, bu nedenle ilk kabuğunu terminallerde giriş kabuğu olarak çalıştırmanız gerekir. Bu, bir dizi soruna neden olur (özellikle, PATHörneğin panellerden çalışan programlar için uygun olan ve böyle bir panel kurulmadığı için düzgün kurulmadığından ~/.bash_profile), ancak her zaman mümkün olmadığından verilen makul bir uzlaşmadır. sanely çalışmasına ~/.bash_profileiçeriğinin bağlı bir görüntü yöneticisi tarafından başlatılan bir oturumun başında etkileşimli olmayan bir ortamda. Bazen ortam ayarlarını yerleştirmeniz önerilir.~/.bashrcbunun yerine bir giriş kabuğu yapılandırmak yerine; Yukarıda tartışıldığı gibi, bu o ortamı geçersiz kılmanıza gerek olmadığı sürece çalışır ve yapmanız gerektiğinde garip kırılmalara neden olur .

Geçenlerde böyle bir sorunun teşhis edilmesine yardım ettim OS X'te ~/.bashrcsonradan ayarları yerleştiren bir kullanıcı daha sonra kullanmaya başladı rvmve perlbrew garip bir davranış gördü, çünkü ikisi tarafından oluşturulan ortamlar ~/.bashrceditörler tarafından "geri alındı" ve sudo(OS X’te) Linux aksine kullanıcının yayar $HOMEböylece onların o ~/.bashrc) kök kabuk tarafından çalıştırıldı. Bu ortamları kullanmaya çalışmadan önce, hiçbir sorun yoktu; onları kullanmaya başladığında, ayarlarının beklenmedik bir şekilde kaybolmasıyla şaşırdılar.


1
Sanırım anladım, daha fazla içselleştirmek için daha çok okumak zorunda kalabilirim ama aşağıdakileri sonuçlandırıyorum. Kurumsal ortamlarda, küresel kabuğun yan etkileri olmadan özelleştirilmiş mermilerin daha iyi kontrolünü sağlamak için, ortam değişkenlerini ~ / .bash_profile dosyasına koymak en iyi yöntemdir . PATH'i düzgün bir şekilde ayarlamak için Ubuntu veya Linux Mint gibi kişisel bir ortamda ~ / .bashrc (ya da / etc / profile ) altına ayarladım . Doğrumuyum?
Viriato

Kurumsal ortamlarla ilgisi sadece bir kullanıcı veya geliştirici olmanıza göre daha azdır; Sistemler ister modulesve rvmsıra Matlab ve Cadence "Geliştirici" biraz farklı tanımları içindir, geliştirici araçlardır. Basit gelişme de bunları gerektirmez, ancak Ruby, Perl, Python veya birden çok sürümünü karşı teste gerektiğinde o zaman gerçekten bir şey gibi istiyorum rvm, perlbrewve virtualenvtüm düz tutmak etrafında yardımına (sırasıyla).
geekosaur

2

dürüst olmak gerekirse, gurunun söylediklerine rağmen bugünlerde çok az fark var.

Bunun arkasındaki sorun, bugünlerde bir giriş kabuğu yerine grafiksel olarak giriş yaptığımızdır. Geçmişte, kullanıcıların giriş yaptıktan hemen sonra bir sunucuda neler olup bittiğine dair kısa bir raporunu görmek istiyoruz - sonra X'i komut satırıyla başlatacağız - bu raporun oluşturulması genellikle biraz zaman alıyor (örneğin, 10-20 saniye). ve sonra, örneğin xterm başladığımızda aynı şeyi görmek istemiyoruz. Böylece fark.

Bugünlerde, ayrımın şu anda önemli olduğunu düşünmüyorum. Ben bash_profile bashrc kaynak eğer hiç kimse seni suçlayamazdı düşünüyorum.

Bunun, macos x için geçerli olmadığını unutmayın (her terminal.app başlatılmış bir giriş kabuğudır)


Tam olarak anladığımdan tam olarak emin değilim, fakat ssh ile oturum açtığımda işyerinde bir giriş kabuğu, daha sonra bash_profile ve bashrc kaynaklanıyor bu yüzden sanırım bu önemli değil. Ama eğer grafiksel olarak giriş yaparsam (bu ne anlama geliyor)? benim kişisel ubuntu giriş yapmak gibi?
Viriato

Burada @bubu cevabını kabul edersiniz - ~/.bash_profilekaynağın çalışmadığı herhangi bir kurulum ~/.bashrcile çalışmak ve kırılmaktan zordur. Grafiksel terminal uygulamaları, sadece ~ / .bashrc kaynağını kullanmanın ve tüm ayarları oraya koymanın daha kolay olduğu anlamına gelir.
RichVel

1

"Grafiksel Girişler" hakkında, hangi * DM'yi kullandığınıza bağlı ...

GDM (Gnome 3.18) ile bu var:

/ Etc / gdm / Xsession

#!/bin/sh   <= *important*

...

# First read /etc/profile and .profile
test -f /etc/profile && . /etc/profile
test -f "$HOME/.profile" && . "$HOME/.profile"
# Second read /etc/xprofile and .xprofile for X specific setup
test -f /etc/xprofile && . /etc/xprofile
test -f "$HOME/.xprofile" && . "$HOME/.xprofile"

Yani, ~ / .profile / bin / sh kullanarak değil / bin / bash komutunu kullanarak giriş yapılır.

İki dava var

  1. / bin / sh , / bin / bash ile bağlantılı ancak "POSIX / Bourne" modunda çalışıyor
  2. / bin / sh olan / bin / çizgi (debian / ubuntu). En hızlı ancak daha az özelliğe sahip (ShellShock desteği;) )

Yani / bin / sh profili ~ / .profile ve ~ / .bash_profile, ~ / .zprofile değil

Bu dosya , yol ve ortam değişkenleri gibi "kabuk agnostik" ayarları için kullanılmalıdır .

YOK giriş-sadece kullanıcı etkileşimi için çalıştırılabilir bir program olabilir ama burada olmalıdır (posta çek, servet, vb ...)

~ /.* rc sadece "etkileşimli" oturumlar içindir (örneğin takma adlar ...)

Etkileşimli oturum açma kabukları için bash ve zsh arasında bir fark vardır

sırayla bash kaynakları .bash_profile, zsh kaynakları sırayla:

  1. ~ / .Zprofile
  2. ~ / .Zshrc
  3. ~ / zlogin (burada ~ / .zshrc ile tanımlanmış takma adlar kullanılabilir. "etkileşimli" + "giriş" kabukları durumunda

~ / .Bash_profile dosyasını yapmanın doğru yolu burada cevaplandı:

.Bashrc ve .bash_profile arasındaki fark

if [ -r ~/.profile ]; then . ~/.profile; fi
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac

Testi (ve profil oluşturmayı) etkinleştirmek için bunu kullanabilirsiniz.

~ / .Bash_profile:

#!/bin/bash

# ------------------------------------------------
export _DOT_BASH_PROFILE_0=`date  --rfc-3339=ns`
# ------------------------------------------------

if [ -f ~/.profile ] ; then
    . ~/.profile
fi

case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac

# ------------------------------------------------
export _DOT_BASH_PROFILE_1=`date  --rfc-3339=ns`
# ------------------------------------------------

~ / .Zprofile:

#!/bin/zsh

# ------------------------------------------------
export _DOT_ZSH_PROFILE_0=`date  --rfc-3339=ns`
# ------------------------------------------------

if [ -f ~/.profile ] ; then
    . ~/.profile
fi

# no need to source, zsh already handle ~/.zshrc

###case "$-" in *i*) if [ -r ~/.zshrc ]; then . ~/.zshrc; fi;; esac

# ------------------------------------------------
export _DOT_ZSH_PROFILE_1=`date  --rfc-3339=ns`
# ------------------------------------------------

sonra test etmek için:

chsh -s /bin/bash

ssh localhost
env

exit

ssh localhost env

ssh -t localhost bash -i -c env


chsh -s /bin/zsh

ssh localhost
env

exit

ssh localhost env

ssh -t localhost bash -i -c env

Bu yüzden RVM / virtualenv ~ / .profile, IMHO içine girmelidir

Ama bu işe yaramaz , bazen ...

Örneğin, virualenvwrapper , yalnızca Xsession'ı çalıştıran kabuk bir "orijinal" bash ise çalışır (BASH_VERSION'ı dışa aktarır)

Bir çizgi sistemindeyseniz, ortam değişkeni ve yol ayarı çalışır, ancak virualenvwrapper işlev tanımı çalışmıyor, çünkü komut dosyası POSIX uyumlu değil.

Komut dosyası herhangi bir hata yapmıyor, ancak herhangi bir "çalışma" tanımı olmadan bitiyor .

Böylece, çevreyi el altında ~ / .profile olarak ayarlayabilirsiniz , yalnızca istemciden doğru python yürütülmesini doğrudan X'ten başlatarak etkinleştirmek için:

export VIRTUAL_ENV="/home/mike/var/virtualenvs/myvirtualenv"
export PATH="$VIRTUAL_ENV/bin:$PATH"
unset PYTHON_HOME

https://gist.github.com/datagrok/2199506

https://www.bountysource.com/issues/9061991-setting-up-your-computer-virtualenvwrapper-linux-all

Ancak virualenvwrapper için iki seçeneğiniz var:

  1. kaynak o ~ / .bash_profile veya ~ / .zprofile (veya ~ / .zlogin) giriş kabuğu olarak görev gördüğü
  2. betiği ~ / .bashrc veya ~ / zshrc dosyasına dahil edin

Bu, X istemcilerinin (örneğin emacs), grafik kabuğundan değil, terminal kabuğundan başlatılması gerektiği anlamına gelir!

"Memnun kalamam ..."


Tamamıyla farklı bir hikaye systemd ile hizmet veriyor Bazı olası alternatifler şunlardır: bir sarmalayıcı betiği yazmak, ortamı "service" tanım dosyasında tanımlamak, ortamı bir üst kabukta kaynaklanmak üzere "env" dosyasına atmak. İşler RVM / virtualenv ile daha da
zorlaşıyor
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.