Bir ortam değişkeninin nereden geldiği nasıl belirlenir?


154

Bir süre önce kurduğum bir Linux örneğim var. Ateşlediğimde ve kurduğum rootbazı ortam değişkenleri olduğu için oturum açtığımda ancak nereden geldiklerini hatırlayamıyorum veya bulamıyorum.

  • Ben kontrol ettim ~/.bash_profile, /etc/.bash_rcve tüm başlangıç komut dosyaları.
  • Ben koşuyoruz findve grepboşuna.

Açıkça görünen bir yere bakmayı unutmam gerektiğini hissediyorum. Bunu çözmek için bir hile var mı?


6
/etc/environmentbaşka biri.
derobert

8
Ve /etc/env.d/*dosyalar. Ama yapmak grep -R "YOUR_VARIABLE" /etc/muhtemelen öğrenmenin en iyi yoludur.
rozcietrzewiacz


@ rozcietrzewiacz en basit yoldur ... eğer değişken gerçekten / etc / altına yerleştirilmişse (benim durumumdaki gibi); cevap olarak gönderirseniz, ben oyla;;)
Line

Yanıtlar:


55

envDeğişkenleri görüntülemek için komutu kullanırsanız, kabaca oluşturuldukları sırayla görünmeleri gerekir. Bunu, sistem tarafından önyüklemenin çok erken bir saatinde veya daha sonraki bir .profile veya başka bir yapılandırma dosyası tarafından ayarlanmışlarsa, bir rehber olarak kullanabilirsiniz. Deneyimlerime göre, setve exportkomutları değişkenlerini alfabetik sıraya göre sıralarlar, böylece listeleme o kadar yararlı olmaz.


1
Bu harika ... bir ortam değişkenini neyin temizlediğini bulmaya çalışıyorum dışında (/ etc / environment içine koyulmuş). :-) (Ve evet, başlangıçta belirleniyor ... Çeşitli yerlerde betiklere satırlar ekliyorum, temizlendiği yere giriş yapmak için ...)
Michael Scheper

128

Eğer zshsizin giriş kabuğu:

zsh -xl

İle bash:

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

Bu, bir giriş kabuğunu simüle eder ve yapılan her şeyi (stderr'in yönlendirildiği alanlar hariç zsh) ve şu anda yorumlanmakta olan dosyanın adını gösterir.

Tek yapmanız gereken, o çıktıdaki ortam değişkeninizin adını aramak. ( scriptKomutu tüm kabuk oturumu çıkışını saklamanıza yardımcı olması için veya bashyaklaşımı için çıktıyı terminal yerine saklamak 7> file.logyerine kullanabilirsiniz ).7>&2xtracefile.log

Eğer değişkeniniz orada değilse, büyük olasılıkla kabuk başlangıçta miras aldı, yani ~/.ssh/environmentX11 oturumunun başlangıcında ( ~/.xinitrc, ~/.xsession) okunan veya PAM yapılandırmasında olduğu gibi ayarlandı veya girişinizi başlatan hizmet tanımına ayarlandı. yöneticisi veya daha önce bazı önyükleme komut dosyalarında. O zaman bir find /etc -type f -exec grep -F THE_VAR {} +yardımcı olabilir.


4
Etkileyici ve yardımsever, teşekkür ederim. Bizim için n00bs, mod hakkında biraz daha bilgi verir misiniz ve bunun bizi içine soktuğu moddan nasıl kurtuluruz? Örneğin, bu çıktıyı basitçe kesemeyiz.
Geoffrey Hale

5
@GeoffreyHale zsh -xl 2>&1, örneğin stderr ve stdout çıktılarını birleştirirseniz, her zamanki gibi grep yapabilirsiniz.
Rakesh,

1
Bunu fishkabukla yapmanın bir yolu var mı ?
Nick Sweeting,

Kullanmış olsam bile zsh -xl 2>&1, bir şekilde normal bir şekilde yapamam. Görünüşe göre çıktı düzgün yeni satırlar içermiyor.
Xerus

Ben sadece kullanabileceğini düşünüyorum PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen), sonra da o rasgele dosyayı grep.
bd1251252

51

İlk bakılacak yerler:

Geniş sistem

  • /etc/environment: özellikle çevre değişkenleri içindir
  • /etc/env.d/*: ortam değişkenleri, birden fazla dosyaya bölünmüş
  • /etc/profile: her tür başlatma betiği
  • /etc/profile.d/*: başlatma komut dosyaları
  • /etc/bashrc, /etc/bash.bashrc: işlevler ve takma adlar içindir

Kullanıcıya özel

  • ~/.bash_profile: giriş (bash-) mermileri için başlatma
  • ~/.bashrc: tüm etkileşimli (bash-) mermiler için ilklendirme
  • ~/.profile: tüm mermiler için kullanılır
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: Dışı deneme kabukları içindeki

31

@Cian doğru. Kullanarak dışında findve grep, bunu nereden geldiğini keşfetmek için yapabileceğiniz pek bir şey yoktur. Bunun gerçekten bir ortam değişkeni olduğunu bilerek, aramanızı / etc / ve ana dizininizde yoğunlaştırmaya çalışırdım. VARIABLEAradığınız uygun değişkenle değiştirin :

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*


1
'Yapamazsınız' diyen bir cevabın, 'evet yapabilirsin' diyen cevaplarla çevrili olması şaşırtıcıdır.
Michael Scheper

Bir değişkenin ayarlandığı NEREYE karar vermenin bir yolunu veren hiçbir cevap göremiyorum. Bazı faydalı ipuçları var, ancak işi yapabilecek tek astar yok.
Andrew Wagner,

Bu şey zamanımı çözdü. Teşekkürler.
Hassan Raza

@MichaelScheper "yapamaz" bulma / grep kullanmadan gerçekleştirir. daha sonra "yapabilirsiniz" nasıl yapılacağı açıklanır grep
Line

23

set -xSiz .profileveya koyarsanız .bash_profile, sonraki tüm kabuk komutları standart hataya kaydedilir ve bunlardan birinin bu değişkenleri ayarlayıp ayarlamadığını görebilirsiniz. Bunu da izlemek için set -xen üste koyabilirsiniz /etc/profile. Çıktı çok ayrıntılı olabilir, bu nedenle onu gibi bir dosyaya yönlendirmek isteyebilirsiniz exec 2>/tmp/profile.log.

Sisteminizde PAM kullanılıyorsa, veya pam_enviçindeki yükleme isteklerini arayın . Bu modül ortam değişkenlerini belirtilen dosyalardan veya hiçbir dosya belirtilmemişse ( ve Debian ve Ubuntu'da) bir sistem varsayılanından yükler . Linux'ta çevre değişken tanımları olan bir başka dosya (ile başlayan satırları aramaktır )./etc/pam.conf/etc/pam.d/*/etc/environment/etc/security/pam_env.conf/etc/login.defsENV_


5

Başlangıç ​​komut dosyalarınızı (dot) veya kullanarak kaynak yaptıkları dosyalar için kontrol edin . Bu dosyalar ve dışında başka dizinlerde olabilir ..source/etc$HOME


2

İçin zsh(başlatma sırasında) erişilen dosyaları yararlı olabilir izleme kullanıcılar, onlar değil çok fazla olan ve bir şey tanımlandı nerede tek-birer bulmak için içlerinden bakabilirsiniz.

zsh -o SOURCE_TRACE

0

ortam değişkenleri / etc / profile dosyasında saklanır, bu yüzden daha / etc / profile yapın ve sadece istediğiniz env değişkenlerini kontrol edin ve / etc / profile mevcut değilse, o zaman ana dizinde .profile dosyası için lokk


1
Ortam değişkenleri vardır değil saklanır /etc/profileAşağıdaki örneklerle için geniş orada sistem bunları tanımlayabilirsiniz, bashbir giriş kabuğu olarak kullanıldığında. Dosyalar ve / veya komut satırındaki tanımları okuduktan sonra kabuk işlemi tarafından saklanırlar.
Anthon

-2

Örneğin, HISTFILE değişkenini ve değerini bulmak veya geçmişinde hangi değişkenlerin tanımlandığını bilmek istiyorsanız, bunu kabuğa yazmanız gerekir:

set | grep HIST
env | grep HIST
printenv | grep HIST

Eğer adı zaten biliyorsan, neden olmasın ki echo "$HISTFILE"?
Jeff Schaller

çünkü $ HISTFILE değişkeninin nerede tanımlandığını bulmak istiyoruz. Ayrıca eğer tarihte hangi değişkenlerin tanımlandığını bilmek istersem
Vusal Aliyev

2
Ne yazık ki, setdeğişkeni hangi dosyanın tanımladığını söylemiyor.
Jeff Schaller
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.