4

Я пытаюсь найти, какой файл добавляет папку /opt/texbin к моей переменной PATH в Ubuntu. Его нет в моем /etc/environment . sudo grep -lr texbin . 2>/dev/null ничего не выводит в папку /etc И все же, если я добавлю set -x в начало моего файла /etc/zshenv я увижу, что /opt/texbin находится в моем PATH до того, как zsh получит этот файл.

Есть идеи?

3 ответа3

4

Я бы попробовал этот подход, чтобы отследить источник /opt/texbin в вашей переменной PATH:

  1. Чтобы получить список файлов, которые фактически считываются (например, нестандартный файл может быть получен из другого файла!), Вы можете вызвать zsh с включенной опцией SOURCE_TRACE :

    $ zsh -o sourcetrace
    +/etc/zshenv:1> <sourcetrace>
    +/home/user/.zshrc:1> <sourcetrace>
    +/home/user/.zcompdump:1> <sourcetrace>
    +/home/user/.zshrc-last:1> <sourcetrace>
    
  2. Проверьте эти файлы, где переменная PATH вступает в игру:

    $ grep -ie "path.*=" files_from_step_1
    

    Чувствительность к регистру имеет решающее значение, так как zsh использует массив $path , который автоматически преобразуется в разделенный двоеточиями список $PATH разделенный двоеточиями, и наоборот.

  3. Если вам все еще не повезло, попробуйте включить отладочное сообщение в /etc/zshenv , откуда сначала читаются команды:

    print -l $path
    

    Это даст вам хороший список переменной PATH, которая zsh наследует от своего родительского процесса (диспетчера отображения, процесса инициализации и т.д.).*

  4. Если путь действительно унаследован от начального процесса, важно знать, какие процессы актуальны:

    $ pstree -apH $$
    

    Это создает дерево процессов, в котором выделен процесс оболочки (pid в $$). Проверьте файлы конфигурации для этих процессов, и имейте в виду, что

    • source /some/file или . /some file также может изменить путь
    • если вы отредактируете, например, /etc/profile в текущей консоли, выйдите из системы и снова войдите в систему, родительский процесс (менеджер входа в систему X) может по-прежнему иметь старую среду.+

* Как вы уже написали, PATH уже содержит /opt/texbin перед чтением /etc/zshenv , проверяется set -x в /etc/zshenv . Я не получаю вывод с этой техникой, но с моим шагом 3, поэтому я включил и другие шаги в свой ответ.

+ Из-за такого поведения некоторое время назад я сильно пострадал ...

1

Правильный способ активировать трассировку выполнения или трассировку источника во время загрузки /etc/zshenv - это активировать ее с помощью команды оболочки: zsh -l -o xtrace , zsh -l -o sourcetrace - обязательно попробуйте с -l вариант, так как элемент пути может быть добавлен только при входе в систему.

Кроме того, если вы все еще получаете элемент пути, добавленный до загрузки /etc/zshenv , вы можете проверить наличие файла ~/.pam_environment . Это локальная для пользователя версия файла /etc/environment и загружается примерно в то же время, до оболочки или пользовательской среды. Проверьте man-страницу "pam_env" для более подробной информации об используемом формате - он отличается для пользовательского файла.

Еще одна незначительная возможность - переменная среды ENV . Когда SH-совместимая оболочка запускается в SH-совместимом режиме, файл, путь которого находится в ENV , загружается как файл запуска прежде всего. Поиск документации вашей оболочки для более подробной информации. login.defs также используется при входе в систему и различными утилитами user/login, но /etc/environment является стандартом для всех современных систем входа в систему и является предпочтительным для установления переменной PATH .

0

Переменная PATH, которая передается вашей оболочке при входе в систему, определяется в /etc/login.defs . Здесь есть две установки, ENV_SUPATH и ENV_PATH . В зависимости от того, войдете ли вы в систему как пользователь root или как пользователь, один из них передается в оболочку через переменную окружения PATH. После передачи переменной PATH в оболочку любые дополнительные изменения контролируются сценариями запуска оболочки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .