Як визначити, звідки походить змінна середовища?


153

У мене є екземпляр Linux, який я створив деякий час тому. Коли я запускаю його та входжу в систему, оскільки rootіснують деякі змінні середовища, які я встановив, але я не можу згадати або знайти, звідки вони взялися.

  • Я перевірив ~/.bash_profile, /etc/.bash_rcі всі сценарії запуску.
  • Я біг findі grepбезрезультатно.

Я відчуваю, що я, мабуть, забуваю виглядати в якомусь місці очевидного. Чи є хитрість розібратися в цьому?


6
/etc/environmentє ще один.
дероберт

8
І /etc/env.d/*файли. Але grep -R "YOUR_VARIABLE" /etc/це, мабуть, найкращий спосіб це з’ясувати.
rozcietrzewiacz


@rozcietrzewiacz найпростіший спосіб ... якщо змінна дійсно знаходиться десь під / etc / (як у моєму випадку); якщо ви опублікуєте це як відповідь, я б проголосив;)
рядок

Відповіді:


55

Якщо ви використовуєте envкоманду для відображення змінних, вони повинні відображатися приблизно в тому порядку, в якому вони були створені. Ви можете використовувати це як керівництво, якщо вони були встановлені системою дуже рано при завантаженні, або пізнішим .profile або іншим файлом конфігурації. У моєму досвіді, setі exportкоманди будуть сортувати свої змінні в алфавітному порядку, так що список не такий корисний.


1
Це чудово ... за винятком того, що я намагаюся з’ясувати, що очищає змінну середовища (встановлено в / etc / environment). :-) (І так, він встановлюється спочатку ... Я додаю рядки в сценарії в різні журнали, щоб увійти, коли це буде очищено ...)
Майкл Шепер

127

Якщо zshваша оболонка для входу:

zsh -xl

З bash:

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

Це буде імітувати оболонку входу та показувати все, що робиться (за винятком областей, з яких перенаправляється stderr zsh), а також ім'я файлу, який зараз інтерпретується.

Тому все, що вам потрібно зробити, - це шукати ім'я змінної вашого середовища в цьому висновку. (ви можете скористатися scriptкомандою, щоб допомогти вам зберігати весь вихід сеансу оболонки, або для bashпідходу використовувати 7> file.logзамість того, 7>&2щоб зберігати xtraceвихід, file.logа не на терміналі).

Якщо ваша змінна відсутня, то, ймовірно, оболонка успадкувала її під час запуску, тому вона була встановлена ​​раніше, як у конфігурації PAM, в ~/.ssh/environmentабо речі, прочитані під час запуску сеансу X11 ( ~/.xinitrc, ~/.xsession) або встановлена ​​на визначення служби, яка розпочала ваш вхід менеджер або навіть раніше в якомусь сценарії завантаження. Тоді find /etc -type f -exec grep -F THE_VAR {} +може допомогти.


4
Вражаюче та корисне, дякую. Ви б нам пояснили трохи більше про режим, і як ми виходимо з режиму, в який нас це ставить? Наприклад, ми не можемо просто передати грепп цього виводу.
Джеффрі Хейл

5
@GeoffreyHale, якщо ви zsh -xl 2>&1, тобто об'єднати stderr і stdout вихід, ви можете зірвати як завжди.
Ракеш

1
Чи можна зробити це зі fishшкаралупою?
Nick Sweeting

Навіть якщо я користуюся zsh -xl 2>&1, я якось не можу нормально грепати. Мабуть, вихід не містить належних нових рядків чи чогось іншого.
Xerus

Я думаю, ви можете просто скористатися PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen), а потім нав'язати цей випадковий файл.
bd1251252

50

Деякі місця, які варто подивитися спочатку:

Система широка

  • /etc/environment: спеціально призначений для змінних середовища
  • /etc/env.d/*: змінні середовища, розділені на кілька файлів
  • /etc/profile: всі типи сценаріїв ініціалізації
  • /etc/profile.d/*: сценарії ініціалізації
  • /etc/bashrc, /etc/bash.bashrc: призначений для функцій та псевдонімів

Конкретний користувач

  • ~/.bash_profile: ініціалізація для вхідних (bash-) оболонок
  • ~/.bashrc: ініціалізація для всіх інтерактивних (bash-) оболонок
  • ~/.profile: використовується для всіх снарядів
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: Аналогічні для не-Баш оболонок

31

@Cian правильний. Окрім використання findта grep, ви не можете багато що зробити, щоб дізнатись, звідки воно взялося. Знаючи, що це дійсно змінна середовище, я б спробував зосередити ваш пошук у / etc / та вашому домашньому каталозі. Замініть VARIABLEвідповідну змінну, яку шукаєте:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*


1
Дивно, що відповідь, яка говорить "ти не можеш", оточена відповідями "так, ти можеш", має навіть багато відгуків.
Майкл Шепер

Я не бачу відповідей, які насправді дають спосіб визначити, де встановлена ​​змінна. Є кілька корисних підказок, але немає жодного вкладиша, який би міг зробити цю роботу.
Ендрю Вагнер

Ця річ вирішила мій час. Дякую.
Хасан Раза

@MichaelScheper "ви не можете" зробити це без пошуку / grep. пізніше в "Ви можете" описано, як це робити ВИКОРИСТАННЯ grep
рядок

23

Якщо ви поклали set -xу вашому .profileабо .bash_profileвсі наступні команди оболонки будуть записуватися в стандартний потік помилок , і ви можете побачити , якщо один з них встановлює ці змінні. Ви можете поставити set -xвгорі, /etc/profileщоб простежити це. Вихід може бути дуже багатослівним, тому ви, можливо, захочете перенаправити його у файл із чимось подібним exec 2>/tmp/profile.log.

Якщо ваша система використовує PAM, шукайте pam_envзапити на завантаження в /etc/pam.confабо /etc/pam.d/*. Цей модуль завантажує змінні середовища із зазначених файлів або з системного за замовчуванням, якщо не вказано жодного файлу ( /etc/environmentі /etc/security/pam_env.confдля Debian та Ubuntu). Ще один файл із визначеннями змінної середовища в Linux є /etc/login.defs(шукайте рядки, що починаються з ENV_).


5

Перевірте сценарії запуску файлів, які вони джерелом використовують .(крапка) або source. Ці файли можуть бути в інших каталогах, крім /etcта $HOME.


2

Для zshкористувачів відстеження файлів, до яких можна отримати доступ (під час запуску), може бути корисним, їх не так вже й багато, і можна переглядати їх по одному, щоб знайти, де щось було визначено.

zsh -o SOURCE_TRACE

0

змінні середовища зберігаються у файлі / etc / profile, тому зробіть більше / etc / profile і просто перевірте, чи потрібні змінні env, і якщо / etc / profile немає, тоді знайдіть файл .profile у вашому домашньому каталозі


1
Змінні середовища не зберігаються в /etc/profileних, їх можна визначити там, bashде використовується система як оболонка входу. Вони зберігаються під час обробки оболонки після читання визначень з файлів та / або командного рядка.
Антон

-2

Наприклад, якщо ви хочете знайти змінну HISTFILE та її значення або хочете знати, які змінні визначені для історії, ви введете це в оболонці:

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

якщо ви вже знаєте ім'я, чому б і ні echo "$HISTFILE":?
Jeff Schaller

тому що ми хочемо знайти там, де визначена змінна $ HISTFILE. Крім того, якщо я хочу знати, які змінні визначені для вас,
Вусал Алієв,

2
На жаль, setне вказує, який файл визначав змінну.
Jeff Schaller
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.