Localizando a definição de uma função bash

41

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?

metáfora pitônica
fonte

Respostas:

39

Para obter a definição da função:

type -a function_name
Pausado até novo aviso.
fonte
@iconoclast: Sim.
Pausado até novo aviso.
Se você está sempre em Grand Rapids Eu vou te comprar um em pessoa ... caso contrário, podemos encontrar alguma outra maneira ...
iconoclasta
whence -f function_nameemzsh
dezza 13/09/17
66

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 .

# 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

No meu caso, a saída desses comandos é:

foo 32 /source/private/main/developer/cue.pub.sh
Cabelo do cachorro
fonte
3
Perfeito. Acabei de transformar isso em uma função bash no meu arquivo bashrc. whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
Neil
5
@ Neil: Isso é útil, obrigado: deixe-me sugerir o uso de um subshell para localizar o efeito de shoptsem alterar o estado atual do shell: whichfunc () ( shopt -s extdebug; declare -F "$1"; )(observe o uso de em (...)vez de {...}).
precisa saber é o seguinte
Por que esses comandos não funcionam a partir de um script? função funciona corretamente
albfan 7/07
11
Essa deve ser a resposta aceita.
dissolvido
11

Para ver a definição da função (ao contrário de onde ela veio), use:

declare -f <functionname>
Joshua Goldberg
fonte
Eu acho que isso é melhor do que type -aporque não imprimir a irritar locale primeira linha dependente ~~
yuyichao
11
mas como não há localização, essa é uma resposta a uma pergunta não feita - pelo menos aqui
iconoclast
6

bash -xirá 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.

Ignacio Vazquez-Abrams
fonte
Coisas práticas; para capturar o rastreamento em um arquivo, use script out.txt bash -x(novamente, não se esqueça de exit).
precisa saber é o seguinte
-2

de outra maneira, que acho ainda mais simples ultimamente:

  which <functionname>

(isso também mostrará se é um alias ou um script, mas não rastreará a origem de um alias)

Joshua Goldberg
fonte
2
Eu não acho que whichdá informações sobre aliases no BSD ou no Mac. Além disso, esta pergunta é sobre funções e whichnão fornece informações sobre funções.
dbn
Obrigado por essa nota. Vejo agora que "what" apenas resolve funções no zsh, não no bash.
Joshua Goldberg #
2
Eu acho que essa resposta provavelmente convidará votos negativos ... parece não abordar a pergunta, pois não há informações sobre o local.
Iconoclast
Achei útil, com o objetivo de rastrear a declaração, usá-la e descobrir se é um alias ou função, e conhecer a sintaxe com a qual foi declarada. É verdade que apenas a resposta do @ HairOfTheDog fornece o arquivo diretamente.
27716 Joshua Goldberg