Как найти файл, в котором определена функция bash?

В Ubuntu 14.04 описание терминала для rxvt-unicode-256color является частью пакета ncurses-term, а описание для rxvt-unicode является частью ncurses -база .

ncurses-base является важным пакетом, а ncurses-term - нет. Вы можете решить вашу проблему, установив ncurses-term .

33
12.11.2016, 18:16
6 ответов

Отличное решение @icarus работает для функций, до тех пор, пока они определены буквально, а не являются результатом eval содержимого другого файла (в котором файл с eval будет отображаться как источник). Он не будет печатать исходный файл с псевдонимами, встроенными модулями оболочки (например, echo ) и исполняемыми файлами (двоичными или нет), и я считаю, что эта информация недоступна в целом. Некоторые команды могут распечатывать свои исходные файлы (и даже могут быть правдивыми) либо в ходе нормального выполнения, либо в ответ на сигнал.

__ git_ps1 определено в /usr/share/git/git-prompt.sh и /usr/share/git/completion/git-prompt.sh на моя система, Arch Linux, может быть, и у вас будет то же самое.

Взгляните на раздел Invocation в man bash , если вы хотите найти команды, специально созданные в начале оболочки - они могут быть источником других файлов, которые, в свою очередь, являются источником других файлов. файлы.

9
27.01.2020, 19:37

Кажется, это невозможно в bash , но это есть в zsh :

$ type __git_ps1
> __git_ps1 is a shell function from /usr/share/git/git-prompt.sh
16
27.01.2020, 19:37

Объявите функцию с тем же именем и установите ее как можно раньше только для чтения, затем активируйте режим xtrace, например:

__git_ps1(){ :;}
readonly -f __git_ps1
set -x

После этого, когда вы войдете в систему, вы увидит информацию трассировки, которая включает источники файлов. В момент попытки объявления существующей функции только для чтения вы увидите сообщение об ошибке. Последний исходный файл перед ним должен содержать искомую декларацию.

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

-1
27.01.2020, 19:37

Вы пробовали это?

grep -rnw '/path/to/somewhere/' -e "pattern" 

или любую из других команд, найденных здесь:

Как мне найти все файлы, содержащие определенный текст, в Linux? | Stack Overflow

Кажется, мне нужно дать вам больше объяснений. В вашем вопросе задается вопрос: "" Таким образом, если вы запустите следующую команду, она должна вернуть все файлы, в которых определена функция bash.

grep -rnw 'Path2Search' -e "#!/bin/bash"

Программирование на BASH - Функции | Проект документации Linux

-3
27.01.2020, 19:37

Если вы готовы запустить функцию, вы можете получить информацию, используя set -x для отслеживания выполнения и установив переменную PS4 .

  1. Запустите bash с - debugger или используйте shopt -s extdebug для записи дополнительной отладочной информации.

  2. Установите PS4 , «подсказка» выводится при трассировке, чтобы показать исходную строку.

  3. Включите отслеживание.

  4. затем вы можете запустить свою функцию, и для каждой строки вы получите имя файла функции.

  5. используйте set + x , чтобы выключить трассировку.

Итак, в этом случае вы должны запустить

bash --debugger
PS4='+ ${BASH_SOURCE[0]} '
set -x ; __git_ps1 ; set +x
42
27.01.2020, 19:37

Если вы не хотите запускать функцию, вы все равно можете настроить отладку и получить информацию. Шаги:

  1. start bash --debugger или shopt -s extdebug до определения функции.
  2. объявите -F __git_ps1

, и он сообщит, где определена функция.

Преимущества этого метода по сравнению с просмотром аннотированной трассировки выполнения с помощью PS4:

  • Намного меньше выходных данных
  • Он напрямую отвечает на вопрос

Преимущества трассировки выполнения:

  • Просмотреть все вызываемые функции сразу
  • См. отношения между вызываемыми функциями
  • См. рекурсию

Я настоятельно настоятельно рекомендую иметь shopt -s extdebug в начале обоих ~ /. bashrc и ~ / .bash_profile для покрытия различных файлов , используемых в различных случаях вызова .

33
27.01.2020, 19:37

Теги

Похожие вопросы