Bagaimana cara menentukan dari mana variabel lingkungan berasal?

154

Saya memiliki turunan Linux yang saya atur beberapa waktu lalu. Ketika saya menjalankannya dan masuk karena rootada beberapa variabel lingkungan yang saya atur tetapi saya tidak dapat mengingat atau menemukan dari mana mereka berasal.

  • Aku sudah memeriksa ~/.bash_profile, /etc/.bash_rcdan semua skrip startup.
  • Saya sudah menjalankan finddan greptidak berhasil.

Saya merasa seperti saya harus lupa untuk melihat di suatu tempat yang jelas. Apakah ada trik untuk mencari tahu ini?

Joel
sumber
6
/etc/environmentsatu lagi.
derobert
8
Dan /etc/env.d/*file. Tetapi melakukan grep -R "YOUR_VARIABLE" /etc/mungkin adalah cara terbaik untuk mengetahuinya.
rozcietrzewiacz
@rozcietrzewiacz cara paling sederhana ... jika variabel memang terletak di suatu tempat di bawah / etc / (seperti dalam kasus saya); jika Anda mempostingnya sebagai jawaban, saya akan terbalik;)
Baris

Jawaban:

55

Jika Anda menggunakan envperintah untuk menampilkan variabel, mereka akan muncul secara kasar dalam urutan di mana mereka dibuat. Anda dapat menggunakan ini sebagai panduan untuk menentukan apakah mereka ditetapkan oleh sistem pada awal boot, atau oleh .profile atau file konfigurasi lainnya. Dalam pengalaman saya, perintah setdan exportakan mengurutkan variabel-variabel mereka berdasarkan urutan abjad, sehingga cantuman tidak berguna.

Ben Combee
sumber
1
Itu hebat ... kecuali saya mencoba mencari tahu apa yang menghapus variabel lingkungan (diatur dalam / etc / environment). :-) (Dan ya, itu sedang mengatur awalnya ... Saya menambahkan baris dalam skrip di berbagai login di mana ia akan dibersihkan ...)
Michael Scheper
128

Jika zshshell login Anda:

zsh -xl

Dengan bash:

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

Itu akan mensimulasikan shell login dan menunjukkan semua yang dilakukan (kecuali di daerah di mana stderr diarahkan dengan zsh) bersama dengan nama file yang saat ini sedang ditafsirkan.

Jadi yang perlu Anda lakukan adalah mencari nama variabel lingkungan Anda di output itu. (Anda dapat menggunakan scriptperintah untuk membantu Anda menyimpan seluruh output sesi shell, atau untuk bashpendekatan tersebut, gunakan 7> file.logalih-alih 7>&2untuk menyimpan xtraceoutput file.logbukan pada terminal).

Jika variabel Anda tidak ada di sana, maka mungkin shell mewarisi itu pada startup, jadi itu ditetapkan sebelumnya seperti dalam konfigurasi PAM, dalam ~/.ssh/environment, atau hal-hal yang dibaca pada startup sesi X11 Anda ( ~/.xinitrc, ~/.xsession) atau ditetapkan pada definisi layanan yang memulai login Anda manajer atau bahkan lebih awal dalam beberapa skrip boot. Maka find /etc -type f -exec grep -F THE_VAR {} +mungkin membantu.

Stéphane Chazelas
sumber
4
Mengesankan dan bermanfaat, terima kasih. Bagi kami n00bs, maukah Anda menjelaskan sedikit lebih banyak tentang mode dan bagaimana kita keluar dari mode ini menempatkan kita? Sebagai contoh, kita tidak bisa hanya mem-pipe output ini saja.
Geoffrey Hale
5
@ GeoffreyHale jika Anda zsh -xl 2>&1, yaitu menggabungkan stderr dan ouputs stdout, Anda dapat grep seperti biasa.
Rakesh
1
Apakah ada cara untuk melakukan ini dengan fishshell?
Nick Sweeting
Bahkan jika saya menggunakan zsh -xl 2>&1, entah bagaimana saya tidak bisa grep secara normal. Rupanya output tidak mengandung baris baru yang tepat atau sesuatu.
Xerus
Saya pikir Anda hanya bisa menggunakan PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen), lalu melihat file acak itu juga.
bd1251252
51

Beberapa tempat yang harus dilihat terlebih dahulu:

Sistem luas

  • /etc/environment: khusus dimaksudkan untuk variabel lingkungan
  • /etc/env.d/*: variabel lingkungan, pisah dalam banyak file
  • /etc/profile: semua jenis skrip inisialisasi
  • /etc/profile.d/*: skrip inisialisasi
  • /etc/bashrc, /etc/bash.bashrc: dimaksudkan untuk fungsi dan alias

Khusus pengguna

  • ~/.bash_profile: inisialisasi untuk shell login (bash-)
  • ~/.bashrc: inisialisasi untuk semua shell (bash-) interaktif
  • ~/.profile: digunakan untuk semua kerang
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: Serupa untuk kerang non-pesta
beetstra
sumber
31

@Cian benar. Selain menggunakan finddan grep, tidak banyak yang dapat Anda lakukan untuk menemukan dari mana asalnya. Mengetahui bahwa itu memang variabel lingkungan, saya akan mencoba memfokuskan pencarian Anda di / etc / dan direktori home Anda. Ganti VARIABLEdengan variabel yang sesuai yang Anda cari:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

Aaron Toponce
sumber
1
Sangat mengejutkan bahwa jawaban yang mengatakan 'kamu tidak bisa', dikelilingi oleh jawaban yang mengatakan 'ya kamu bisa', bahkan memiliki banyak upvotes ini.
Michael Scheper
Saya tidak melihat jawaban yang benar-benar memberikan cara untuk menentukan DI MANA variabel ditetapkan. Ada beberapa petunjuk yang bermanfaat, tetapi tidak ada satu-liner yang dapat melakukan pekerjaan itu.
Andrew Wagner
Hal ini memecahkan waktu saya. Terima kasih.
Hassan Raza
@MichaelScheper "Anda tidak bisa" melakukannya tanpa find / grep. nanti dalam "Anda bisa" itu dijelaskan bagaimana melakukannya MENGGUNAKAN grep
Line
23

Jika Anda menempatkan set -xdi Anda .profileatau .bash_profile, semua perintah shell selanjutnya akan login ke standard error dan Anda dapat melihat apakah salah satu dari mereka menetapkan variabel-variabel ini. Anda dapat menempatkan set -xdi bagian atas /etc/profileuntuk melacaknya juga. Outputnya bisa sangat bertele-tele, jadi Anda mungkin ingin mengarahkan ulang ke file dengan sesuatu seperti exec 2>/tmp/profile.log.

Jika sistem Anda menggunakan PAM, cari pam_envpermintaan pemuatan di /etc/pam.confatau /etc/pam.d/*. Modul ini memuat variabel lingkungan dari file yang ditentukan, atau dari default sistem jika tidak ada file yang ditentukan ( /etc/environmentdan /etc/security/pam_env.confpada Debian dan Ubuntu). File lain dengan definisi variabel lingkungan di Linux adalah /etc/login.defs(cari baris yang dimulai dengan ENV_).

Gilles
sumber
5

Periksa skrip startup Anda untuk file yang mereka sumber menggunakan .(dot) atau source. File-file itu bisa berada di direktori lain selain /etcdan $HOME.

Dennis Williamson
sumber
2

Untuk zshpengguna, melacak file yang diakses (saat startup) dapat bermanfaat, mereka tidak terlalu banyak dan satu dapat melihat melalui mereka satu per satu untuk menemukan di mana sesuatu didefinisikan.

zsh -o SOURCE_TRACE
Erik Zivkovic
sumber
0

variabel lingkungan disimpan di / etc / file profil jadi lakukan lebih banyak / etc / profile dan cukup periksa variabel env yang Anda inginkan dan jika / etc / profile tidak ada maka lokk untuk file .profile di direktori home Anda

Sarvesh Pawar
sumber
1
Variabel lingkungan tidak disimpan /etc/profile, Anda dapat mendefinisikannya di seluruh sistem untuk mis. bashKetika digunakan sebagai shell login. Mereka disimpan oleh proses shell setelah membaca dalam definisi dari file dan / atau commandline.
Anthon
-2

Misalnya, jika Anda ingin menemukan variabel HISTFILE dan nilainya atau ingin tahu variabel mana yang didefinisikan tentang riwayat maka Anda akan mengetikkan ini di shell:

set | grep HIST
env | grep HIST
printenv | grep HIST
Vusal Aliyev
sumber
jika Anda sudah tahu namanya, mengapa tidak echo "$HISTFILE":?
Jeff Schaller
karena, kami ingin menemukan di mana variabel $ HISTFILE didefinisikan. Juga jika saya tidak ingin tahu variabel mana yang didefinisikan tentang sejarah
Vusal Aliyev
2
Sayangnya, settidak memberi tahu Anda file mana yang mendefinisikan variabel.
Jeff Schaller