В моем $ PATH есть каталог, который я хочу удалить. Но я не могу понять, как он туда попал. Я просмотрел все места, где я могу думать о том, где $ PATH получает set: .profile, .bashrc, .bash_profile, et cetra , но я не могу найти, кто помещает этот конкретный каталог в $ PATH. Ясно, что я не знаю всех вещей, которые меняют $ PATH, когда моя система запускается. Есть ли способ отладить последовательность запуска? В идеале я просто хочу установить ловушку на все, что касается $ PATH. Или может быть файл журнала (или упорядоченный набор файлов журнала), который я могу сканировать. Как узнать, как каждый каталог устанавливается в $ PATH среди всех вещей, которые запускаются при запуске моей системы?
ответ
Есть два способа сделать это:
Try
bash --login -x
в окне терминала. Это будет печатать каждую строку сценариев установки по мере их выполнения (kudos перейдите к kojiro).В качестве альтернативы, вы можете добавить
set -x
в верхней части/etc/profile
или$HOME/.profile
. Опасность здесь в том, что если вы допустили ошибку, ваша система может стать непригодной (если вы больше не можете запускать новую оболочку), плюс вам нужно бытьroot
. Если вы хотите попробовать это, я предлагаю создать два окна терминала, держать их открытыми любой ценой, вносить изменения, а затем запускать новые окна терминала, чтобы увидеть эффекты.Используйте
grep -r PATTERN /
(заменитеPATTERN
на путь, который вы ищете). Это должно искать весь ваш жесткий диск для этого шаблона и может занять много времени. Возможно, начните с домашнего каталога. Если вы хотите искать только в.
файлы, использовать этот трюк:grep -r PATTERN .??*
'bash --login -x' не только имеет такой же эффект. Он не требует прав root или может нарушить вызов оболочки. – kojiro
@kojiro: У меня нет Mac, поэтому я не могу это проверить. Я жду подтверждения. –
@kojiro и @Aaron \ Digjull - Спасибо за эти ответы, которые помогли комбинации. 'Bash -login -x' не показывает вам имя файла, в котором находится команда errant. Но это показало мне PATTERN, где моя проблема была установлена. Поэтому я использовал «grep -r PATTERN. ?? *», чтобы изолировать ошибочный файл. Следует отметить, что эта команда может занять много времени, если ваша файловая система больше, и она, скорее всего, сообщит о многих несвязанных ошибках (в основном: «Нет такого файла или каталога») – user749105
Если вы используете 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 линии в верхней из ваших ~/.bash_profile
(создать его, если он не существует):
set -o functrace
trap '[[ "$BASH_COMMAND" == *" PATH="* ]] && echo "$BASH_COMMAND"' DEBUG
Затем выйти из текущей оболочки и начать новую оболочку.
Он будет печатать каждый раз, когда в вашей среде задана переменная PATH
.
no joy: 'set: нет такой опции : functrace' – user749105
Какая у вас версия bash? – anubhava
GNU bash, версия 3.2.53 (1) -release (x86_64-apple-darwin13) – user749105
'Есть каталог в моей $ PATH, который я хочу удалить', почему бы вам не изменить свой путь, а затем экспортировать его ..? –
Проверяли ли файлы запуска системы в '/ etc' (например,'/etc/bashrc')? Вы можете отредактировать сценарии запуска и каждый из них повторить текущий путь до и после, чтобы понять, где это происходит. Это может дать ключ. – lurker
Посмотрите также на '/ etc/profile' и т. Д. Найдите список загружаемых файлов: [Порядок загрузки загрузочных файлов Zsh/Bash (.bashrc, .zshrc и т. Д.)] (Http://shreevatsa.wordpress.com/2008/03/30/zshbash-startup-files-loading-order-bashrc-zshrc-etc /) – fedorqui