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