typeset -f
vrací funkce s jejich těly, takže k odstranění názvů funkcí se používá jednoduchý skript awk
f1 () { :; }
f2 () { :; }
f3 () { :; }
f4 () { :; }
help () {
echo "functions available:"
typeset -f | awk '/ \(\) $/ && !/^main / {print $1}'
}
main () { help; }
main
Výstup tohoto skriptu:
functions available:
f1
f2
f3
f4
help
Tuto funkci zavoláte s noargumenty a vyplivne pouze seznam názvů funkcí oddělený "bílými znaky".
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.
}
Načtení funkcí do pole:
declare MyVar=($(script.functions));
Zdravý rozum samozřejmě velí, že žádné funkce, které nebyly zapsány do aktuálního souboru před jeho voláním, se v seznamu nezobrazí.
Chcete-li, aby byl seznam pouze pro čtení a byl k dispozici pro export do jiných skriptů vyvolaných tímto skriptem:
declare -rx MyVar=($(script.functions));
Chcete-li vytisknout celý seznam jako nový řádek:
printf "%s\n" "${MyVar[@]}";
Seznam funkcí ve vašem skriptu můžete získat pomocí příkazu grep ve vašem vlastním skriptu. Aby tento přístup fungoval, budete muset své funkce určitým způsobem strukturovat, aby je grep mohl najít. Zde je ukázka:
$ 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
Zde je interaktivní demo:
$ 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
Pokud máte „soukromou“ funkci, kterou nechcete v nápovědě zobrazovat, pak část „funkce“ vynechejte:
my_private_function()
{
# Do something
}
Nejlepší věc, kterou můžete udělat, je vytvořit pole (používáte bash), které obsahuje funkce, které chcete inzerovat, a nechat si je pomocí funkce nápovědy iterovat a vytisknout.
Volání set
sám vytvoří funkce, ale v jejich celistvosti. Stále byste museli analyzovat hledání věcí končících na (), abyste získali pověstné symboly .
Je také pravděpodobně rozumnější použít něco jako getopt
pro otočení --function-name
do function_name
s argumenty. Ale rozumný je relativní a kód jste neposlali :)
Další možností je vytvořit načítatelný soubor pro bash (fork set
), který to splňuje. Upřímně řečeno, raději bych šel s analýzou před psaním načítatelného pro tento úkol.