Eu trabalho em um ambiente que possui muita magia de script de shell herdada. Uma coisa usada pesadamente na linha de comando são as funções do bash que são originadas de algum arquivo incluído em algum arquivo incluído em algum arquivo ... incluído no meu .bash_profile. Existe uma maneira de obter a definição ou ainda melhor a localização da definição dessas funções sem encontrá-las nos 5 níveis de inclusões?
41
whence -f function_name
emzsh
Supondo que você tenha uma função denominada foo, os comandos abaixo obterão o local da definição da função, ou seja, o nome do arquivo no qual a função está definida, bem como o número da linha na qual a função é definida nesse arquivo .
No meu caso, a saída desses comandos é:
fonte
whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
shopt
sem alterar o estado atual do shell:whichfunc () ( shopt -s extdebug; declare -F "$1"; )
(observe o uso de em(...)
vez de{...}
).Para ver a definição da função (ao contrário de onde ela veio), use:
fonte
type -a
porque não imprimir a irritar locale primeira linha dependente ~~bash -x
irá despejar o que o bash está executando ao iniciar, o que deve permitir que você o rastreie com mais facilidade. Não esqueça de sair do shell recém-aberto.fonte
script out.txt bash -x
(novamente, não se esqueça deexit
).de outra maneira, que acho ainda mais simples ultimamente:
(isso também mostrará se é um alias ou um script, mas não rastreará a origem de um alias)
fonte
which
dá informações sobre aliases no BSD ou no Mac. Além disso, esta pergunta é sobre funções ewhich
não fornece informações sobre funções.