9

いくつかの機能を備えた Bourne Shell スクリプトがあり、次の方法で呼び出すことができます。

my.sh <func_name> <param1> <param2>

内部でfunc_name()は、 と で呼び出されparam1ますparam2

helpパラメーターがなくても、使用可能なすべての関数を一覧表示する関数を作成したいと考えています。

質問: スクリプト内からスクリプト内のすべての関数名のリストを取得するにはどうすればよいですか?

それを解析して関数パターンを探す必要を避けたいと思います。間違えやすい。

更新:コード。自分のhelp()機能を次のようにしたいmain()- コードに追加された機能は、自動的にヘルプに追加されます。

#!/bin/sh

# must work with "set -e"

foo ()
{
    echo foo: -$1-$2-$3-
    return 0
}

# only runs if there are parameters
# exits
main ()
{
    local cmd="$1"
    shift
    local rc=0
    $cmd "$@" || rc=$?
    exit $rc
}

if [[ "$*" ]]
then
    main "$@"
    die "how did we get here?"
fi
4

4 に答える 4

16

独自のスクリプトで 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
    "$@"
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
}
于 2010-04-15T00:14:26.293 に答える
14

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
于 2011-05-03T10:39:18.037 に答える
5

この関数を引数なしで呼び出すと、「空白」で区切られた関数名のみのリストが出力されます。


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[@]}";
于 2011-05-03T08:54:43.660 に答える
1

最善の方法は、アドバタイズしたい関数を含む配列(bashを使用している)を作成し、ヘルプ関数を繰り返して印刷することです。

単独で呼び出すsetと関数が生成されますが、全体が生成されます。ことわざの記号を取得するには、()で終わるものを探すことを解析する必要があります。

getoptまた、引数を使用して--function-name変換するようなものを使用することもおそらく賢明function_nameです。しかし、まあ、正気は相対的であり、あなたはコードを投稿していません:)

もう1つのオプションは、これを実現するbash(のフォークset)のロード可能ファイルを作成することです。正直なところ、このタスクのロード可能ファイルを作成する前に、解析を行うことをお勧めします。

于 2010-04-13T15:32:00.993 に答える