Как найти место, где постоянная определяется в Bash

Мне нужно найти хотя бы файл где $JAVA_HOME определяется (экспортируется). Есть ли какой-нибудь умный способ сделать это помимо текстового поиска в файлах?

1 ответ

Решение

Чтобы найти, какой файл определяет JAVA_HOME, бежать:

PS4='+ $BASH_SOURCE:$LINENO:' BASH_XTRACEFD=7 bash -xlic ""  7>trace.out

Это генерирует отладочный вывод для bash войти в оболочку и сохранить ее в файл trace.out, В этом файле будет много строк. Линии выглядят так:

+ /etc/profile:7:PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
+ /etc/profile:9:export PATH

Это показывает (а) имя исполняемого файла, (б) номер строки и (в) отладочный вывод для этой строки в этом файле. Просто ищите это для JAVA_HOME, Например:

grep JAVA_HOME trace.out

Как это устроено

  • PS4='+ $BASH_SOURCE:$LINENO:'

    При создании трассировки выполнения, bash будет начинать каждую строку с расширением PS4, Здесь мы делаем PS4 отобразить исходный файл и номер строки, которая читается.

  • BASH_XTRACEFD=7

    Это отправляет след выполнения 7 который является файловым дескриптором, выбранным в надежде, что это тот, который bash файлы запуска не будут связываться.

  • bash -xlic ""

    Это запускает Bash с параметрами -x, который заставляет все команды отображаться с PS4 незамедлительный, -l который инструктирует bash рассматривать это как оболочку входа в систему, -i что делает оболочку интерактивной, и -c "" который заставляет новую оболочку завершиться после завершения инициализации.

  • 7>trace.out

    Это перенаправляет вывод трассировки в файл.

Другие вопросы по тегам