Я работаю в среде, в которой много магии старых скриптов. В командной строке часто используются функции bash, которые берутся из некоторого файла, включенного в некоторый файл, включенный в некоторый файл ... включенный в мой файл .bash_profile. Есть ли способ получить определение или даже лучше определить местоположение этих функций, не отслеживая их через 5 уровней включений?
41
whence -f function_name
вzsh
Предполагая, что у вас есть функция с именем foo, приведенные ниже команды получат расположение определения функции, то есть получат имя файла, в котором определена функция, а также номер строки, в которой функция определена в этом файле. ,
В моем случае вывод этих команд:
источник
whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
shopt
без изменения текущего состояния оболочки:whichfunc () ( shopt -s extdebug; declare -F "$1"; )
(обратите внимание на использование(...)
вместо{...}
).Чтобы увидеть определение функции (в отличие от того, откуда она взялась), используйте:
источник
type -a
потому, что он не печатает зависимую от локали первую строку ~~bash -x
выгрузит то, что работает bash при запуске, что позволит вам легче отследить его. Не забудьте выйти из недавно открытой оболочки.источник
script out.txt bash -x
(опять же, не забудьтеexit
).другой способ, который я нахожу в последнее время еще проще:
(это также покажет, является ли это псевдонимом или сценарием, но не будет отслеживать источник псевдонима)
источник
which
дает информацию об псевдонимах на BSD или Mac. Кроме того, этот вопрос касается функций иwhich
не дает информации о функциях.