特定のスクリプトのすべての関数とエイリアスを一覧表示するには?

特定のスクリプトのすべての関数とエイリアスを一覧表示するには?

やや長いBashスクリプトがあります。その中にあるすべての機能をリストできればいいと思います。より良い方法は、関数名やパラメータなどの使い方に関するドキュメントを一覧表示することです。

答え1

一般的な方法は、declare -fそれを使用して対話型bashシェルから長い関数のリストを印刷することです。しかし、スクリプト内ではほとんどの外部関数が定義されていないため、リストは短くて便利です。

だから:

declare -f

機能(および定義)が一覧表示されます。そして:

declare -F

名前機能リストのみが印刷されます。

extdebug設定すると、各関数定義の行番号も印刷する(あまり役に立たない)オプションがありますdeclare -F。しかし、extdebugスクリプトがロードされたときに設定する必要があります(それを開くにはすべての行を知る必要があるため)。

答え2

通常、関数には同じものを使用してアクセスできるため、スクリプトを実行せずにすべての関数を一覧表示することはできませんeval $(/some/program)。ただし、関数が「正常に」宣言されている場合は、関数定義のように見えるものを検索できます。

grep -E '^[[:space:]]*([[:alnum:]_]+[[:space:]]*\(\)|function[[:space:]]+[[:alnum:]_]+)' myscript

シェルスクリプトには関数型や文書機能がないため、すべての文書はコメントから出てください。以下は、一般的に使用される関数定義と、直前または直後のコメントを抽出するおおよそのPerlコードの断片です。

perl -0777 -ne '
    while (/^((?:[ \t]*\#.*\n)*)               # preceding comments
             [ \t]*(?:(\w+)[ \t]*\(\)|         # foo ()
                      function[ \t]+(\w+).*)   # function foo
             ((?:\n[ \t]+\#.*)*)               # following comments
           /mgx) {
        $name = "$2$3";
        $comments = "$1$4";
        $comments =~ s/^[ \t]*#+/#/mg;
        chomp($comments);
        print "$name\n$comments\n";
    }' myscript

副作用なしにスクリプトを実行できる場合、またはすべての関数定義を添字で区切ることができる場合は、関数名を印刷するより正確な方法は、スクリプトを実行してからbashにすべての関数定義を印刷することです。奇妙な形式の関数定義を含み、偽の肯定を除く上記のテキスト検索方法とは異なり、この方法ではコメントが見つかりません。

bash -c '. myscript; typeset -f'

答え3

declare -F | awk '{print $NF}' | sort | egrep -v "^_" 

関連情報