Я не могу понять, как найти файл, в котором определена функция bash ( __git_ps1
в моем случае).
Я экспериментировал с declare
, type
, which
, но ничего не говорит мне исходный файл. Я где-то читал, что declare
можно напечатать имя файла и номер строки, но не было объяснено как. help
Страница declare
не говорит , это тоже.
Как я могу получить эту информацию?
$PATH
, тоtype
работать не будет. Вы можете попробовать просто использоватьfind
илиlocate
.locate
будет намного быстрее, так как он использует уже существующую базу данных, но не будет работать, если команда была установлена совсем недавно.Ответы:
Если вы готовы к запуску функции, то вы можете получить информацию, используя
set -x
для отслеживания выполнения и установкиPS4
переменной.Запустите bash
--debugger
или используйтеshopt -s extdebug
для записи дополнительной отладочной информации.Установите
PS4
«подсказку», напечатанную при трассировке, чтобы показать исходную строку.Включите трассировку.
Затем вы можете запустить свою функцию, и для каждой строки вы получите имя файла функции.
используйте,
set +x
чтобы отключить трассировку.Так что для этого случая вы бы запустить
источник
Если вы не желаете запускать функцию, вы все равно можете настроить отладку и получить информацию. Шаги
bash --debugger
илиshopt -s extdebug
до того, как функция будет определена.declare -F __git_ps1
и он сообщит, где определена функция.
Преимущества этого метода по сравнению с просмотром аннотированной трассировки выполнения в PS4
Преимущества трассировки исполнения
Я настоятельно рекомендую иметь
shopt -s extdebug
в начале оба файла~/.bashrc
и~/.bash_profile
покрывать разные файлы, используемые в разных случаях Invocation .источник
shopt -s extdebug
вызывается после определения функции. Осторожно, номера строк могут быть отключены (текущая ошибка), если функция объявлена черезeval
.bash --debugger
мне пришлось фактически запустить завершение, чтобы получить определенную функцию завершения и сообщить о нейdeclare -F _vpnc
.~/.bash_profile
в Xubuntu 18.04.shopt -s extdebug
установить по умолчанию?Отличное решение @ icarus работает для функций, если они определены буквально, а не как результат
eval
содержимого другого файла (в котором файл с символомeval
будет отображаться как источник). Он не будет печатать исходный файл с псевдонимами, встроенными модулями оболочки (напримерecho
) и исполняемыми файлами (двоичными или нет), и я считаю, что эта информация вообще недоступна. Некоторые команды могут печатать свои исходные файлы (и даже могут быть правдивыми об этом), либо в ходе обычного выполнения, либо в ответ на сигнал.__git_ps1
определяется в моей системе Arch Linux/usr/share/git/git-prompt.sh
и/usr/share/git/completion/git-prompt.sh
в моей системе, поэтому она может быть одинаковой для вас.Взгляните на раздел « Вызов »,
man bash
если вы хотите найти команды, специально созданные в начале оболочки - они могут получать другие файлы, которые, в свою очередь, являются источником других файлов.источник
bash
?$HOME/.bashrc
и в$HOME/.profile
. См. Linuxfromscratch.org/blfs/view/svn/postlfs/profile.html, который объясняет некоторые детали того, когда и как каждый файл получен./etc/profile
,$HOME/.bash_profile
,$HOME/.bash_login
, И содержание$ENV
и$BASH_ENV
необходимость быть добавлены в список.Кажется, что это невозможно
bash
, но этоzsh
:источник
find
/locate
/grep
.~/.whatever
файлы, что и bash по умолчанию, и даст только полезные ответы для функций, определенных в общих местах, как в этом случае, которые не были переопределены~/.bashrc
или что-то еще.Объявите функцию с тем же именем и установите ее только для чтения как можно раньше, затем активируйте режим xtrace, например:
После этого при входе в систему вы увидите информацию трассировки, которая включает в себя поиск файлов. В тот момент, когда будет предпринята попытка объявления существующей функции только для чтения, вы увидите сообщение об ошибке. Последний полученный файл должен содержать объявление, которое вы ищете.
Возможно, вам придется поместить это в системный профиль Bash. Также не забудьте отменить изменения после обнаружения виновного.
источник
Ты пробовал это?
или любую другую команду, найденную здесь:
Как найти все файлы, содержащие определенный текст в Linux? | Переполнение стека
Кажется, мне нужно дать вам больше объяснений. Ваш вопрос спрашивает "" Таким образом, если вы выполните следующую команду, она должна вернуть все файлы, в которых определена функция bash.
BASH Программирование - Функции | Проект документации Linux
источник