Como faço para listar as funções definidas no meu shell?

221

Eu posso digitar alias para mostrar uma lista de todos os aliases.

Mas para funções, tudo o que posso fazer é cumprimentar .bash_profile.

Isso apenas obtém os que estão no arquivo, não os definidos em arquivos subsidiários ou dinamicamente.

Existe uma maneira mais conveniente de descobrir quais funções estão definidas atualmente?

Dov
fonte
Possível duplicado de obter uma lista de nomes de função em um script shell
Alastair Irvine
2
@AlastairIrvine Obrigado pela indicação duplicada; no entanto, eu resolvi o contrário. Essa pergunta tem muito mais visualizações e votos positivos, além de uma seleção mais ampla de respostas; e a resposta aceita na sua duplicata nomeada é decididamente obscura e provavelmente está errada.
Tripleee

Respostas:

271

declare -F

Os nomes e definições de funções podem ser listados com a -fopção do declarecomando builtin (consulte Bash Builtins). A -Fopção para declare listará apenas os nomes das funções (e, opcionalmente, o arquivo de origem e o número da linha).

Manual de Referência do Bash

O Arquetípico Paulo
fonte
1
em GNU festa 4.3.46 (1) -release (x86_64-pc-linux-gnu) -F listas de nomes de listas / -f toda função
ceph3us
5
Para obter o arquivo / linha de origem "opcional" #, parece que você deve habilitar extdebug ( shopt -s extdebug) E fornecer um ou mais nomes de funções para o declare -Fcomando. IOW, declare -Fse não fornecer nomes de arquivos / linha # s mesmo quando extdebug está habilitado, que não é clara a partir da documentação, nem é particularmente intuitiva, IMO.
Ron Burk
Consulte a resposta do @ user495470 abaixo para obter uma solução melhor.
starbeamrainbowlabs
82

Supondo que o shell bash:

typeset -f

listará as funções.

typeset -F

listará apenas os nomes das funções.

Randall Bohn
fonte
8
Minha festa v4.1.17 (9) -release diz:Obsolete. See `help declare'.
kevinarpe
5
Ainda é bom saber que é sinônimo.
precisa saber é o seguinte
62
declare -F

lhe dará os nomes de todas as funções

type function_name

fornecerá a fonte para uma função específica

John Lawrence Aspden
fonte
2
Ou apenas uso -f declare (minúsculo) para a fonte
Katastic Voyage
51

declare -F realmente imprime comandos declare e não apenas nomes de funções:

$ declare -F
declare -f function1
declare -f function2

Você pode usar compgen -A functionpara imprimir apenas nomes de funções:

$ compgen -A function
function1
function2
Lri
fonte
6
compgen -A functionera exatamente o que eu estava procurando.
2
Agradável! Eu queria aliases bem no meu caso ... pode receber ambos os aliases e funções comcompgen -a -A function
Matt Byrne
+1 e usei o seguinte para produzir apenas minhas funções pessoais (no Linux Debian):compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Dmytro Dzyubak
30

typeset está obsoleto, use:

declare -f

ou

declare -f function_name

ou

type function_name
Robert
fonte
4
set | grep " ()"

No lugar do grep, você também pode usar o fgrep ou o hgrep (o hgrep é o meu favorito, é o grep, mas acelera o resultado do 'grep-ped'.

O hgrep pode ser encontrado aqui: ACME Labs hgrep

AtomicKobold
fonte
1
Isto irá listar funções, mas também variáveis que têm `()` em valor
Alois Mahdal
2
@AloisMahdal Aqui está um que obras: set | grep " () $" | cut -d' ' -f1. Mas é excessivamente complicado em comparação com as outras respostas.
Wjandrea
5
grepnão é uma boa solução para isso, seqüências de caracteres que correspondem às definições de função causam falsos positivos. O @wjandrea ainda pode ser capturado por sequências de várias linhas, assim como qualquer regex.
7188 Matt
1

Não sou especialista nisso, ainda estou aprendendo, mas depois de encontrar essa pergunta e sua resposta porque queria o mesmo, escrevi o seguinte (com base no " resposta " A declaração do arquetípico Paulo ") para me dar o que eu última análise: uma lista formatada de aliases e funções:

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    declare -F | awk {'print $3'}
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    alias | awk {'print $2'} | awk -F= {'print $1'}
    echo
    echo -e "\033[0m"
}

Isso foi antes de eu ver a resposta de Lri e, assim, extrapolando disso, substituí o declareealias linhas pelos compgencomandos apropriados , para obter:

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    compgen -A function
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    compgen -A alias
    echo
    echo -e "\033[0m"
}

Woks um deleite para o que eu queria. Compartilhar caso ajude mais alguém.

Há uma infinidade de outras "ações" disponíveis para compgen -A [action](e outras opções, é compgenclaro). Encontrei uma boa redação aqui, que também inclui um link para a página do manual (porque man compgennão funciona em alguns casos).

DavidT
fonte