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?

Respostas:



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

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>

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.


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)


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.