Как найти место, где постоянная определяется в 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
Это перенаправляет вывод трассировки в файл.