как определить, откуда появилась переменная окружения?

<p>у меня есть экземпляр linux, который я настроил некоторое время назад. когда я запускаю его и регистрируюсь как <code>root</code>, я устанавливаю некоторые переменные окружения, но не могу вспомнить или найти, откуда они пришли.</p><ul> <li>я проверил <code>~/.bash\_profile</code>, <code>/etc/.bash\_rc</code> и все сценарии запуска.</li> <li>я запустил <code>find</code> и <code>grep</code> безрезультатно.</li> </ul><p>я чувствую, что, должно быть, забываю посмотреть в каком-то месте очевидном. есть ли хитрость для выяснения этого?</p>

<p>если вы используете команду <code>env</code> для отображения переменных, они должны отображаться примерно в том порядке, в котором они были созданы. вы можете использовать это как руководство к тому, были ли они установлены системой очень рано при загрузке, или более поздним .profile или другим файлом конфигурации. по моему опыту, команды <code>set</code> и <code>export</code> сортируют свои переменные в алфавитном порядке, поэтому листинг не так полезен.</p>

<p>если <code>zsh</code> - ваша учетная запись shell:</p><pre><code>zsh -xl </code></pre><p>с <code>bash</code>:</p><pre><code>ps4='+$bash_source> ' bash_xtracefd=7 bash -xl 7>&2 это будет имитировать оболочку входа в систему и покажет все, что сделано (кроме областей, где stderr перенаправляется с zsh) вместе с именем файла, который интерпретируется в настоящее время.поэтому все, что вам нужно сделать, это найти имя вашей переменной среды в этом выводе. (вы можете использовать команду script, чтобы сохранить весь вывод сеанса shell, или для подхода bash используйте 7> file.log вместо 7>&2 для сохранения вывода xtrace в file.log вместо терминала).если вашей переменной там нет, то, вероятно, оболочка унаследовала ее при запуске, поэтому она была установлена ранее, как в конфигурации pam, в ~/.ssh/environment, или что-то прочитанное при запуске вашего сеанса x11 (~/.xinitrc, ~/.xsession) или задайте определение службы, которое запускало ваш менеджер входа в систему, или даже раньше, в каком-нибудь загрузочном скрипте. потом find /etc -type f -exec grep -f the_var {} + может помочь.

некоторые места, чтобы посмотреть в первую очередь:<strong>для всей системы</strong> /etc/environment: специально предназначено для переменных среды /etc/env.d/: переменные среды, разделенные на несколько файлов /etc/profile: все типы сценариев инициализации /etc/profile.d/: сценарии инициализации /etc/bashrc, /etc/bash.bashrc: предназначен для функций и псевдонимов <strong>зависит от пользователя</strong> ~/.bash_profile: инициализация для оболочек входа в систему (bash-) ~/.bashrc: инициализация для всех интерактивных (bash-) оболочек ~/.profile: используется для всех оболочек ~/.cshrc, ~/.zshrc, ~/.tcshrc: аналогично для небашковых оболочек 

@ циан это правильно. помимо использования find и grep, вы мало что можете сделать, чтобы выяснить, откуда он взялся. зная, что это действительно переменная окружения, я попытался бы сфокусировать ваш поиск в/etc/и вашем домашнем каталоге. замените variable соответствующей переменной, которую вы ищете:$ grep -r variable /etc/*</code></p><p><code>$ grep -r variable ~/.

если вы поставите 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_).

проверьте ваши скрипты запуска на наличие файлов, которые они используют . (точка) или source. эти файлы могут находиться в других каталогах, кроме /etc а также $home</code>.</p>

<p>для пользователей <code>zsh</code> отслеживание файлов, к которым осуществляется доступ (во время запуска), может быть полезным, их не так много, и можно просмотреть их один за другим, чтобы найти, где что-то было определено.</p><pre><code>zsh -o source\_trace </code></pre>

<p>переменные окружения хранятся в файле/etc/profile, поэтому сделайте больше/etc/profile и просто проверьте, какие переменные env вам нужны, а если/etc/profile отсутствует, то lokk для файла .profile в вашем домашнем каталоге</p>