36

Я работаю в среде, в которой много магии старых скриптов. В командной строке часто используются функции bash, которые берутся из некоторого файла, включенного в некоторый файл, включенный в некоторый файл ... включенный в мой файл .bash_profile. Есть ли способ получить определение или даже лучше определить местоположение этих функций, не отслеживая их через 5 уровней включений?

5 ответов5

61

Предполагая, что у вас есть функция с именем foo, приведенные ниже команды получат расположение определения функции, то есть получат имя файла, в котором определена функция, а также номер строки, в которой функция определена в этом файле. ,

# Turn on extended shell debugging
shopt -s extdebug

# Dump the function's name, line number and fully qualified source file  
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

В моем случае вывод этих команд:

foo 32 /source/private/main/developer/cue.pub.sh
33

Чтобы получить определение функции:

type -a function_name
11

Чтобы увидеть определение функции (в отличие от того, откуда она взялась), используйте:

declare -f <functionname>
6

bash -x сбросит то, что работает bash при запуске, что должно позволить вам легче отследить его. Не забудьте выйти из недавно открытой оболочки.

-2

другой способ, который я нахожу в последнее время еще проще:

  which <functionname>

(это также покажет, псевдоним или сценарий, но не будет отслеживать источник псевдонима)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .