typeset -f
本体を含む関数を返すため、単純な awk スクリプトを使用して関数名を抽出します
f1 () { :; }
f2 () { :; }
f3 () { :; }
f4 () { :; }
help () {
echo "functions available:"
typeset -f | awk '/ \(\) $/ && !/^main / {print $1}'
}
main () { help; }
main
このスクリプトの出力:
functions available:
f1
f2
f3
f4
help
<ブロック引用>
この関数を引数なしで呼び出すと、「空白」で区切られた関数名のみのリストが出力されます。
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.
}
<ブロック引用> 関数を配列にロードするには:
declare MyVar=($(script.functions));
<ブロック引用> もちろん、これが呼び出される前に現在のファイルにソースされていない関数は、リストに表示されません。
リストを読み取り専用にし、このスクリプトによって呼び出される他のスクリプトにエクスポートできるようにするには:
declare -rx MyVar=($(script.functions));
<ブロック引用> リスト全体を改行で区切って印刷するには:
printf "%s\n" "${MyVar[@]}";
独自のスクリプトで grep コマンドを使用すると、スクリプト内の関数のリストを取得できます。このアプローチを機能させるには、関数を特定の方法で構造化して、grep がそれらを見つけられるようにする必要があります。ここにサンプルがあります:
$ 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
インタラクティブなデモは次のとおりです:
$ 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
ヘルプに表示したくない「プライベート」関数がある場合は、「関数」の部分を省略してください:
my_private_function()
{
# Do something
}
最善の方法は、アドバタイズしたい関数を含む配列 (bash を使用している) を作成し、ヘルプ関数を反復して出力することです。
set
を呼び出す 単独で関数が生成されますが、その全体が生成されます。ことわざのシンボルを取得するには、() で終わるものを探して解析する必要があります。 .
getopt
のようなものを使用することもおそらく賢明です --function-name
を回す function_name
に 引数付き。しかし、まあ、正気は相対的であり、コードを投稿していません:)
もう 1 つのオプションは、bash 用のローダブル (set
のフォーク) を作成することです。 ) これを実現します。正直なところ、このタスク用にローダブルを作成する前に解析を行いたいと思います.