2014-12-15 4 views
4

В моем $ PATH есть каталог, который я хочу удалить. Но я не могу понять, как он туда попал. Я просмотрел все места, где я могу думать о том, где $ PATH получает set: .profile, .bashrc, .bash_profile, et cetra , но я не могу найти, кто помещает этот конкретный каталог в $ PATH. Ясно, что я не знаю всех вещей, которые меняют $ PATH, когда моя система запускается. Есть ли способ отладить последовательность запуска? В идеале я просто хочу установить ловушку на все, что касается $ PATH. Или может быть файл журнала (или упорядоченный набор файлов журнала), который я могу сканировать. Как узнать, как каждый каталог устанавливается в $ PATH среди всех вещей, которые запускаются при запуске моей системы?

+0

'Есть каталог в моей $ PATH, который я хочу удалить', почему бы вам не изменить свой путь, а затем экспортировать его ..? –

+2

Проверяли ли файлы запуска системы в '/ etc' (например,'/etc/bashrc')? Вы можете отредактировать сценарии запуска и каждый из них повторить текущий путь до и после, чтобы понять, где это происходит. Это может дать ключ. – lurker

+2

Посмотрите также на '/ etc/profile' и т. Д. Найдите список загружаемых файлов: [Порядок загрузки загрузочных файлов Zsh/Bash (.bashrc, .zshrc и т. Д.)] (Http://shreevatsa.wordpress.com/2008/03/30/zshbash-startup-files-loading-order-bashrc-zshrc-etc /) – fedorqui

ответ

5

Есть два способа сделать это:

  1. Try bash --login -x в окне терминала. Это будет печатать каждую строку сценариев установки по мере их выполнения (kudos перейдите к kojiro).

    В качестве альтернативы, вы можете добавить set -x в верхней части /etc/profile или $HOME/.profile. Опасность здесь в том, что если вы допустили ошибку, ваша система может стать непригодной (если вы больше не можете запускать новую оболочку), плюс вам нужно быть root. Если вы хотите попробовать это, я предлагаю создать два окна терминала, держать их открытыми любой ценой, вносить изменения, а затем запускать новые окна терминала, чтобы увидеть эффекты.

  2. Используйте grep -r PATTERN / (замените PATTERN на путь, который вы ищете). Это должно искать весь ваш жесткий диск для этого шаблона и может занять много времени. Возможно, начните с домашнего каталога. Если вы хотите искать только в . файлы, использовать этот трюк: grep -r PATTERN .??*

+1

'bash --login -x' не только имеет такой же эффект. Он не требует прав root или может нарушить вызов оболочки. – kojiro

+0

@kojiro: У меня нет Mac, поэтому я не могу это проверить. Я жду подтверждения. –

+1

@kojiro и @Aaron \ Digjull - Спасибо за эти ответы, которые помогли комбинации. 'Bash -login -x' не показывает вам имя файла, в котором находится команда errant. Но это показало мне PATTERN, где моя проблема была установлена. Поэтому я использовал «grep -r PATTERN. ?? *», чтобы изолировать ошибочный файл. Следует отметить, что эта команда может занять много времени, если ваша файловая система больше, и она, скорее всего, сообщит о многих несвязанных ошибках (в основном: «Нет такого файла или каталога») – user749105

4

Если вы используете BASH, способ Войти погрузочные работы этот порядок:

  • /etc/profile сначала прочитать.
  • $HOME/.bash_profile читается.
  • Если $HOME/.bash_profile не существует, то $HOME/.bash_login читается.
  • Если $HOME/.bash_login не существует, то $HOME/.profile читается

Примечание:. Это $HOME/.bashrc не читать по умолчанию. Тем не менее, многие люди делают источник в своем файле .bashrc при регистрации.

Когда вызывается оболочка, и это не оболочка входа, загружается файл $HOME/.bashrc.


По умолчанию PATH Мака является /bin:/usr/bin:/usr/sbin:/sbin. Это устанавливается через /etc/profile, который выполняет /usr/libexec/path_helper. Это берет начальные пути от /etc/paths.d/... и от /etc/paths. /etc/paths.d добавляет только в каталог /opt/X11/bin, если установлен X11. В противном случае используется /etc/paths и содержит пути по умолчанию.

Шахта устанавливается:

  • /usr/local/bin
  • /usr/bin
  • /bin
  • /usr/sbin
  • /sbin

Я использую /usr/local/bin для сторонних инструментов. или более новые версии уже установленных инструментов. Например, /usr/bin/svn - версия 1.7.17, а /usr/local/bin/svn - версия 1.8.10. Me, вызывающий svn, вызывается версия Subversion I, а не родная версия.

В этом случае версия Subversion версии 1.8 фактически установлена ​​в /opt/subversion/bin/svn, но я создаю символическую ссылку на нее в /usr/local/svn. Я делаю это для любого инструмента, который я устанавливаю: инструмент устанавливается в /opt, и я связываю двоичные файлы и скрипты с /usr/local/bin, поэтому они находятся в моем $PATH.

2

Места эти 2 линии в верхней из ваших ~/.bash_profile (создать его, если он не существует):

set -o functrace 
trap '[[ "$BASH_COMMAND" == *" PATH="* ]] && echo "$BASH_COMMAND"' DEBUG 

Затем выйти из текущей оболочки и начать новую оболочку.

Он будет печатать каждый раз, когда в вашей среде задана переменная PATH.

+0

no joy: 'set: нет такой опции : functrace' – user749105

+0

Какая у вас версия bash? – anubhava

+0

GNU bash, версия 3.2.53 (1) -release (x86_64-apple-darwin13) – user749105