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?



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


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


62
declare -F

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

type function_name

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


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

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

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


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).

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.