0

シェルスクリプト(私が調達しているシェルスクリプト関数ライブラリ)内のすべての関数のリストを生成したいと思います。現在、私は次のような方法でタイプセットを実験しています。

typeset -f
typeset -F
typeset -F | awk -F"declare -f " '{print $2}' | grep -v '_'

私が抱えている問題は、関数ライブラリにないいくつかの関数がリストされており、関数リストからこれらを削除する方法や、より良い方法で関数リストを生成する方法がわからないことです。私はあなたがこれに関して持っているかもしれないどんな考えでも歓迎します。

ボーナスは、関数がシェルスクリプトに表示される順序で関数リストを生成することです。

4

2 に答える 2

1

シェルはbashだと思います。typeset (または declare ) は現在の環境を表示します。関数は環境の一部です:

  • 環境に固有の順序付けはありません (名前は出力でソートされます)
  • 不要な関数は環境から継承される可能性があり、以前にdeclare -xでエクスポート用にマークされていました

「env」を試して、クリーンな環境でスクリプトを開始できます。試してください:

env -i "PATH=$PATH" "TERM=$TERM" "LANG=$LANG" myscript.sh

出発点として。

bash で関数を列挙する最良の方法は、ここに文書化されています: Where is function's declaration in bash? 「declare -F」はファイル名を正規化しないことに注意してください。

while read xx yy fn; do
    func=( $(shopt -s extdebug; declare -F $fn) )
    printf  "%-30s %4i %-30s\n" "${func[@]:2}" "${func[1]}" "${func[0]}"
done < <(declare -F)

必要なファイル名でフィルタリングし、行番号でソートするだけです。

于 2013-01-08T11:23:25.853 に答える
1

私が持っている1つのアプローチは次のとおりです(コードは関数ライブラリスクリプトに含まれています):

initialListOfFunctionsInEnvironment="$(typeset -F | awk -F"declare -f " '{print $2}')"
# declare functions
finalListOfFunctionsInEnvironment="$(typeset -F | awk -F"declare -f " '{print $2}')"
diff  <(echo "${initialListOfFunctionsInEnvironment}" ) <(echo "${finalListOfFunctionsInEnvironment}") | grep -E '^(<|>)' | awk -F"> " '{print $2}'

これにより、関数ライブラリ スクリプトが読み込まれたときに環境に追加されるすべての関数の単純なリストが生成されるようです。このアプローチに対する批判は歓迎されます。

于 2013-01-08T13:29:24.613 に答える