it-swarm-id.com

Bagaimana cara menentukan dari mana variabel lingkungan berasal?

Saya memiliki turunan Linux yang saya atur beberapa waktu lalu. Ketika saya menjalankannya dan masuk sebagai root ada beberapa variabel lingkungan yang saya atur tetapi saya tidak dapat mengingat atau menemukan dari mana asalnya.

  • Saya sudah memeriksa ~/.bash_profile, /etc/.bash_rc, dan semua skrip startup.
  • Saya sudah menjalankan find dan grep tidak berhasil.

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

177
Joel

Jika Anda menggunakan perintah env untuk menampilkan variabel, variabel tersebut akan ditampilkan secara kasar sesuai urutan pembuatannya. 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 set dan export akan mengurutkan variabel-variabel mereka berdasarkan urutan alfabet, sehingga cantuman tidak berguna.

63
Ben Combee

Jika zsh adalah Shell 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 area di mana stderr dialihkan 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 perintah script untuk membantu Anda menyimpan seluruh output sesi Shell, atau untuk pendekatan bash, gunakan 7> file.log dari pada 7>&2 untuk menyimpan xtrace output ke file.log bukannya di terminal).

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

158

Beberapa tempat yang harus dilihat terlebih dahulu:

Sistem lebar

  • /etc/environment: khusus untuk variabel lingkungan
  • /etc/env.d/*: variabel lingkungan, dipecah menjadi beberapa 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 interaktif (bash-)
  • ~/.profile: digunakan untuk semua shell
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: serupa untuk cangkang non-bash
65
beetstra

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

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

34
Aaron Toponce

Jika Anda memasukkan set -x Di .profile Atau .bash_profile Anda, semua perintah Shell selanjutnya akan dicatat ke kesalahan standar dan Anda dapat melihat apakah salah satu dari mereka menetapkan variabel-variabel ini. Anda dapat meletakkan set -x Di bagian atas /etc/profile Untuk melacaknya juga. Outputnya bisa sangat verbose, jadi Anda mungkin ingin mengarahkan ulang ke file dengan sesuatu seperti exec 2>/tmp/profile.log.

Jika sistem Anda menggunakan PAM, cari pam_env Muat permintaan di /etc/pam.conf Atau /etc/pam.d/*. Modul ini memuat variabel lingkungan dari file yang ditentukan, atau dari default sistem jika tidak ada file yang ditentukan (/etc/environment Dan /etc/security/pam_env.conf Di Debian dan Ubuntu). File lain dengan definisi variabel lingkungan di Linux adalah /etc/login.defs (Cari baris yang diawali dengan ENV_).

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

Untuk pengguna zsh, melacak file yang diakses (selama startup) dapat berguna, mereka tidak terlalu banyak dan satu dapat melihat melalui mereka satu per satu untuk menemukan di mana sesuatu didefinisikan.

zsh -o SOURCE_TRACE
4
Erik Zivkovic

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

0
Sarvesh Pawar