¿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?



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


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.


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


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

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

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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.