GNU/Linux >> Linux Esercitazione >  >> Linux

Ottieni un elenco di nomi di funzioni in uno script di shell

typeset -f restituisce le funzioni con i loro corpi, quindi viene utilizzato un semplice script awk per estrarre i nomi delle funzioni

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

Questo script restituisce:

functions available:
f1
f2
f3
f4
help

Chiami questa funzione senza argomenti e genera solo un elenco di nomi di funzioni separati da "spazi bianchi".

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

Per caricare le funzioni in un array:

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

Naturalmente, il buon senso impone che tutte le funzioni che non sono state inserite nel file corrente prima che questo venga chiamato non verranno visualizzate nell'elenco.

Per rendere l'elenco di sola lettura e disponibile per l'esportazione in altri script richiamati da questo script:

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

Per stampare l'intero elenco come separato da una nuova riga:

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

Puoi ottenere un elenco di funzioni nel tuo script usando il comando grep sul tuo script. Affinché questo approccio funzioni, dovrai strutturare le tue funzioni in un certo modo in modo che grep possa trovarle. Ecco un esempio:

$ 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

Ecco una demo interattiva:

$ 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

Se hai una funzione "privata" che non vuoi mostrare nella guida, ometti la parte "funzione":

my_private_function()
{
    # Do something
}

La cosa migliore da fare è creare un array (stai usando bash) che contenga le funzioni che vuoi pubblicizzare e che la tua funzione help le ripeta e le stampi.

Chiamando set da solo produrrà le funzioni, ma nella loro totalità. Dovresti comunque analizzare la ricerca di cose che finiscono in () per ottenere i proverbiali simboli .

Probabilmente è anche più sensato usare qualcosa come getopt per compiere --function-name in function_name con argomenti. Ma, beh, sensato è relativo e non hai postato il codice :)

L'altra opzione è creare un file caricabile per bash (un fork di set ) che realizza questo. Onestamente, preferirei procedere con l'analisi prima di scrivere un caricabile per questo compito.


Linux
  1. Come ottenere l'indirizzo IP esterno in uno script di shell?

  2. Timeout in uno script di shell?

  3. Directory corrente dello script Shell?

  4. Come ottenere il PID dal processo figlio biforcuto nello script della shell

  5. Ottieni una riga specifica dal file di testo usando solo lo script della shell

Funzioni Bash

Shell Scripting Parte V:Funzioni in Bash

Tutorial sulle funzioni di Bash Shell con 6 esempi pratici

Ottenere i nomi delle funzioni in una libreria condivisa a livello di codice

Ottieni nomi e indirizzi delle funzioni esportate in Linux

Come posso ottenere il mio indirizzo IP esterno in uno script di shell?