GNU/Linux >> Tutoriales Linux >  >> Linux

Obtener una lista de nombres de funciones en un script de shell

typeset -f devuelve las funciones con sus cuerpos, por lo que se usa un script awk simple para obtener los nombres de las funciones

f1 () { :; }
f2 () { :; }
f3 () { :; }
f4 () { :; }
help () {
    echo "functions available:"
    typeset -f | awk '/ \(\) $/ && !/^main / {print $1}'
}
main () { help; }
main

Este script genera:

functions available:
f1
f2
f3
f4
help

Usted llama a esta función sin argumentos y arroja una lista de nombres de funciones separados por "espacios en blanco" solamente.

function script.functions () {
    local fncs=`declare -F -p | cut -d " " -f 3`; # Get function list
    echo $fncs; # not quoted here to create shell "argument list" of funcs.
}

Para cargar las funciones en una matriz:

declare MyVar=($(script.functions));

Por supuesto, el sentido común dicta que cualquier función que no se haya incluido en el archivo actual antes de que se llame no aparecerá en la lista.

Para hacer que la lista sea de solo lectura y esté disponible para exportar a otros scripts llamados por este script:

declare -rx MyVar=($(script.functions));

Para imprimir la lista completa separada por saltos de línea:

printf "%s\n" "${MyVar[@]}";

Puede obtener una lista de funciones en su script usando el comando grep en su propio script. Para que este enfoque funcione, deberá estructurar sus funciones de cierta manera para que grep pueda encontrarlas. Aquí hay una muestra:

$ cat my.sh
#!/bin/sh

function func1() # Short description
{
    echo func1 parameters: $1 $2
}

function func2() # Short description
{
    echo func2 parameters: $1 $2
}

function help() # Show a list of functions
{
    grep "^function" $0
}

if [ "_$1" = "_" ]; then
    help
else
    "[email protected]"
fi

Aquí hay una demostración interactiva:

$ my.sh 
function func1() # Short description
function func2() # Short description
function help() # Show a list of functions


$ my.sh help
function func1() # Short description
function func2() # Short description
function help() # Show a list of functions


$ my.sh func1 a b
func1 parameters: a b

$ my.sh func2 x y
func2 parameters: x y

Si tiene una función "privada" que no desea que aparezca en la ayuda, omita la parte "función":

my_private_function()
{
    # Do something
}

Lo mejor que puede hacer es crear una matriz (está usando bash) que contenga las funciones que desea anunciar y hacer que su función de ayuda las itere e imprima.

Llamando a set solo producirá las funciones, pero en su totalidad. Todavía tendría que analizar eso buscando cosas que terminan en () para obtener los proverbiales símbolos .

Probablemente también sea más sensato usar algo como getopt para convertir --function-name en function_name con argumentos Pero bueno, la cordura es relativa y no has publicado código :)

Su otra opción es crear un cargable para bash (una bifurcación de set ) que logra esto. Honestamente, preferiría analizar sintácticamente antes de escribir un archivo cargable para esta tarea.


Linux
  1. Cómo usar las funciones de shell de la línea de comandos en Linux

  2. ¿Obtener el uso de la CPU en el script de Shell?

  3. Shell script directorio actual?

  4. Cómo obtener PID del proceso secundario bifurcado en el script de shell

  5. Obtenga una línea específica del archivo de texto usando solo un script de shell

Cómo definir y usar funciones en Linux Shell Script

Funciones bash

Shell Scripting Parte V:Funciones en Bash

Tutorial de funciones de Bash Shell con 6 ejemplos prácticos

Obtenga la dirección MAC usando un script de shell

¿Cómo puedo obtener mi dirección IP externa en un script de shell?