PATH değişkeninin bash olarak nerede ayarlandığının tam görünümü


17

Birkaç yerde PATHayarlanmış /etc/profileveya .profileev dir dosyada okudum .

Yolun ayarlandığı tek yerler bunlar mı? Bunu daha iyi anlamak istiyorum.

Gelen /etc/profiledosyanın şu yorum söylediği gibi "system-wide .profile file for the Bourne shell". Bu, profil dosyalarının bash için ana yapılandırma dosyaları olduğu anlamına mı geliyor?

Bu dosyada PATHvar ayarlanan hiç görmüyorum . Giriş .profiledizinindeki dosyada şu satır var:

PATH="$HOME/bin:$PATH"

PATHGörünüşe göre sıfırlanıyor , çünkü zaten ayarlanmış $PATHdizeyi $HOME/bin:doğru ile birleştiriyor ? Ama eğer etc/profileve ~/.profileayarı yalnızca dosyalardır PATHnerede $PATHo tanımlı değilse bu kod satırı içinde gelen /etc/profile?

Deneyimli biri PATHdeğişkenin geniş ve ayrıntılı bir açıklamasını verebilir mi? Teşekkürler!

Yanıtlar:


20

PATHAyarlanabilecek birçok yer var .

loginProgram varsayılan değerine ayarlar. Bu varsayılan değerin nasıl yapılandırıldığı sisteme bağlıdır. Çoğu gömülü olmayan Linux sisteminde, /etc/login.defskök ve diğer kullanıcılar için farklı değerlerle alınır . Ne yaptığını öğrenmek login(1)için sisteminizdeki kılavuza bakın.

PAM kullanan sistemlerde , özellikle pam_envmodülde, ortam değişkenleri sistem genelindeki dosyada /etc/environmentve kullanıcı başına dosyada ayarlanabilir ~/.pam_environment.

Daha sonra oturum açmanın (ancak cron işleri değil) birçok yolu, sistem çapında ve kullanıcı başına yapılandırma dosyalarını okuyan bir oturum açma kabuğu yürütür . Bu dosyalar PATH, genellikle girdi eklemek için ancak bazen başka şekillerde değerini değiştirebilir . Hangi dosyaların okunduğu, giriş kabuğunun ne olduğuna bağlıdır. Bourne / POSIX tarzı mermiler okundu /etc/profileve ~/.profile. Bash okur /etc/profile, fakat başına kullanıcı dosyası için yalnızca arasında ilk varolan dosyasını okur ~/.bash_profile, ~/.bash_loginve ~/.profile. Zsh okur /etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, /etc/zloginve ~/.zlogin. Birçok GUI oturumu yüklenmeyi düzenler /etc/profileve ~/.profilebu, görüntü yöneticisine, masaüstü ortamına veya diğer oturum başlatma komut dosyasına ve her dağıtımın bunları nasıl ayarladığına bağlıdır.


4

İlk PATH değişkeni genellikle olarak ayarlanır. /etc/profile Bazen bir sys yöneticisi PATH değişkenlerini kaynağa koyar./etc/profile.d

Bunlar sistem PATH değişkenleri, oturum açan herkesin varsayılan olarak devralmalarını (yerel olarak aşırı sürülmedikçe) değiştirir. İşimde yaygın olarak /usr/binkullandığımız /optve birkaç özel konum olmasına rağmen , bu genellikle belirgin yollar belirler , böylece bunlar da orada ayarlanır.

Kullanıcı başına oturum açma bazında hesaplarda PATH de tanımlanabilir ~/.profile. Bu, tüm kullanıcıların erişemediği şeyleri tanımlayabilir; departman başkanları ikili dosya çalıştırabilir /optancak diğer kullanıcılar bu ikili dosyalarla uğraşmazlar. Kullanıcılar bu dosyayı kendileri de değiştirebilir ve güzel olan şey .profile, kabuğa özgü olmamasıdır; giriş yaparsanız, oradaki PATH seti kaynaklanır.

Kabuk özgü oturum açma, yol tarif edilebilir ~/.bash_profile, ~/.bashrcya da .cshrc, ya da benzer. Kullanıcılar, belirli mermiler için belirli yollar istiyorlarsa veya tüm kişisel tercihlerini orada tutarlarsa PATH'ı burada ayarlayabilirler.

Özetle: / etc / profile ve /etc/profile.d geleneksel olarak basamaklı ayarlardır; devralınırlar ve genellikle kişisel nokta dosyalarına eklenirler (ancak kullanıcı bunun yerine geçersiz kılmayı seçebilir). Kişisel nokta dosyaları genellikle bir kullanıcı tarafından ayarlanır.

Elbette, bir kabuğun ortam değişkenleri de vardır, bu nedenle yerel ortam değişkeni, yapılandırma dosyalarından herhangi birine varsayılan PATH'yi ekleyebilir veya geçersiz kılabilir.


Az önce bahsettiğiniz tüm dosyaları kontrol ettim, ~ / .bash_profile ve .cshrc mevcut değil. /Etc/profile.d dir: appmenu-qt5.sh, bash_completion.sh & vte.sh dosyasındaki 3 komut dosyası da PATH değişkenini ayarlamaz. İkili / bin / bash programında varsayılan PATH ayarlanmış "kabukta ortam değişkenleri de var" ile ne demek istiyorsun? $ PATH terminalini yankıladığımda: / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games ama her şeyin gerçekten nerede kurulduğuna dair bir fikrim yok.
Larry Lawless

Sanırım sorunuzu biraz yanlış okudum, PATH'ın ayarlanabileceği tüm yerleri sorduğunuzu sanıyordum, ancak PATH'nin başlangıçta nerede belirlendiğiyle daha fazla ilgilendiğinizi düşünüyorum . Bunun için bak /etc/bashrc. Bu, tüm başlangıç ​​ortam değişkenlerini içermesi gereken BASH'in nasıl başlatılacağını belirler. Sistemimde, /etc/bashrcokuyor /etc/profile.dama sadece 3 dosyanız var gibi görünüyor, /etc/profile.dbu yüzden dağıtımınız farklı yapıyor olabilir.
Klaatu von Schlacker

1
Temelde bunun içini ve dışını bilmek istiyorum. Keşke Ken Thompson babam olsaydı :)
Larry Lawless

Oraya gideceksin. İnanın, bu şeyleri günlük olarak bir süre kullandıktan sonra, her şey batmaya başlar ve "neden?" Diye sormaya devam ettiğiniz sürece. ve cevaplar için dokümanlar okumak, sonunda çok şey öğrenirsiniz!
Klaatu von Schlacker

Linux Mint 18 Cinnamon /etc/profile.d/jdk_home.sh adresini kontrol ettiğinizden emin olun. Bu dosyayı jdk_home.sh.old olarak yeniden adlandırdım ve şimdi yolum geçersiz kılmaya devam etmiyor ve java -version'ı çağırabilir ve Java 9'u beklenen. Ben bile doğru güncelleme-aternatives --config java bu jdk_home.sh dosya $ PATH geçersiz kılma tuttu Java 9 seçilmiş olsa
flyingdrifter

3

Diğer cevaplara eklemek için:

bashayarlayacaktır PATHo ortamda ayarlanmış değilse kodlanmış bir varsayılan değere. Bir Ubuntu Server 16.04.2 makinesinde şunu alıyorum:

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Bu değerin gerçekten sabit kodlanmış olup olmadığını ve stringsyardımcı programı kullanarak ortamdan veya bir dosyadan okunmadığını kontrol edebiliriz :

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Ancak Arch Linux makinemde farklı bir sonuç elde ediyorum:

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin

Bu nedenle, kullanılan varsayılan bashişletim sistemine / dağıtımına bağlı olarak, ikili dosyanın oluşturulduğu anda bu varsayılanın seçildiği anlaşılı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.