¿Cómo enumero las funciones definidas en mi shell?

222

Puedo escribir alias para mostrar una lista de todos los alias.

Pero para las funciones, todo lo que puedo hacer es grep my .bash_profile.

Eso solo obtiene los que están en ese archivo, no los definidos en archivos subsidiarios o dinámicamente.

¿Hay alguna forma más conveniente de averiguar qué funciones están definidas actualmente?

Dov
fuente
2
@AlastairIrvine Gracias por la nominación duplicada; sin embargo, lo resolví al revés. Esta pregunta tiene significativamente más puntos de vista y votos a favor, así como una selección más amplia de respuestas; y la respuesta aceptada en su duplicado nominado es decididamente oscura y podría decirse que es incorrecta.
tripleee

Respuestas:

272

declare -F

Los nombres y definiciones de funciones se pueden enumerar con la -fopción del declarecomando incorporado (ver Bash Builtins). La -Fopción para declare listará solo los nombres de las funciones (y opcionalmente el archivo fuente y el número de línea).

Manual de referencia de Bash

El arquetipo de Pablo
fuente
1
en GNU bash 4.3.46 (1) -release (x86_64-pc-linux-gnu) -F enumera nombres / -f enumera toda la función
ceph3us
55
Para obtener el archivo / línea de origen "opcional", parece que debe habilitar extdebug ( shopt -s extdebug) Y suministrar uno o más nombres de función al declare -Fcomando. OIA, declare -Fno no proporcionar nombres de ficheros / línea # S incluso cuando extdebug está habilitado, lo que no está claro a partir de la documentación, ni es particularmente intuitiva, la OMI.
Ron Burk
Consulte la respuesta de @ user495470 a continuación para obtener una mejor solución.
starbeamrainbowlabs
82

Asumiendo bash shell:

typeset -f

enumerará las funciones.

typeset -F

enumerará solo los nombres de las funciones.

Randall Bohn
fuente
8
My bash v4.1.17 (9) -release dice:Obsolete. See `help declare'.
kevinarpe
55
Todavía es bueno saber que es un sinónimo.
bmacnaughton
62
declare -F

le dará los nombres de todas las funciones

type function_name

le dará la fuente para una función particular

John Lawrence Aspden
fuente
2
O simplemente use declare -f (minúscula) para la fuente
Katastic Voyage
51

declare -F en realidad imprime comandos de declaración y no solo nombres de funciones:

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

Puede usar compgen -A functionpara imprimir solo nombres de funciones:

$ compgen -A function
function1
function2
Lri
fuente
66
compgen -A functionera justo lo que estaba buscando.
2
¡Agradable! También quería alias en mi caso ... puedes obtener ambos alias y funciones concompgen -a -A function
Matt Byrne
+1 y he usado lo siguiente para generar solo mis funciones personales (en Linux Debian):compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Dmytro Dzyubak
30

la composición está obsoleta, utilice:

declare -f

o

declare -f function_name

o

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

En lugar de grep , también puede usar fgrep o hgrep (hgrep es mi favorito personal, es grep pero resalta el resultado 'grep-ped').

hgrep se puede encontrar aquí: ACME Labs hgrep

AtomicKobold
fuente
1
Esto enumerará las funciones, pero también las variables que tienen un valor `()`
Alois Mahdal
2
@AloisMahdal Aquí hay uno que funcione: set | grep " () $" | cut -d' ' -f1. Pero es demasiado complicado en comparación con las otras respuestas.
wjandrea
55
grepno es una buena solución para esto, las cadenas que coinciden con las definiciones de funciones causarán falsos positivos. @wjandrea todavía puede ser atrapado por cadenas de varias líneas, como lo hará cualquier expresión regular.
Matt
1

No soy un experto en esto, todavía estoy aprendiendo, pero después de encontrar esta pregunta y su respuesta porque quería lo mismo, escribí lo siguiente (basado en la respuesta " La declaración del Arquetipo de Pablo ") para darme en última instancia lo que buscaba : Una lista formateada de ambos alias y funciones:

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"
}

Eso fue antes de ver la respuesta de Lri , y extrapolando de eso, reemplazo las líneas declarey aliascon los compgencomandos apropiados , para obtener:

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"
}

Es una delicia para lo que quería. Compartir en caso de que ayude a alguien más.

Hay una multitud de otras "acciones" disponibles para compgen -A [action](y otras opciones, por compgensupuesto). Encontré una buena reseña aquí que también incluye un enlace a la página del manual (porque man compgenen algunos casos no funciona).

DavidT
fuente