Я работаю в среде, в которой много магии старых скриптов. В командной строке часто используются функции bash, которые берутся из некоторого файла, включенного в некоторый файл, включенный в некоторый файл ... включенный в мой файл .bash_profile. Есть ли способ получить определение или даже лучше определить местоположение этих функций, не отслеживая их через 5 уровней включений?
5 ответов
Предполагая, что у вас есть функция с именем 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
Чтобы получить определение функции:
type -a function_name
Чтобы увидеть определение функции (в отличие от того, откуда она взялась), используйте:
declare -f <functionname>
bash -x
сбросит то, что работает bash при запуске, что должно позволить вам легче отследить его. Не забудьте выйти из недавно открытой оболочки.
другой способ, который я нахожу в последнее время еще проще:
which <functionname>
(это также покажет, псевдоним или сценарий, но не будет отслеживать источник псевдонима)