bash関数のメタデータの割り当てと検査


10

私は開発プロジェクトで通常行う多くのタスクを自動化する多くのbash関数を生成して登録します。その世代は、私が取り組んでいるプロジェクトのメタデータに依存します。

このようにして、関数に生成されたプロジェクトの情報を注釈を付けたいです。

func1() {
# This function was generated for project: PROJECT1
echo "do my automation"
}

理想的には、定義を調べるとコメントを見ることができます。

$ type func1

func1 is a function
func1 () 
{
    # This function was generated for project: PROJECT1
    echo "do my automation"
}

しかし、どういうわけかbashは、関数の実行時ではなく、関数のロード時にコメントを無視するようです。だからコメントは失われ、私はこの結果を得ます:

func1 is a function
func1 () 
{
    echo "do my automation"
}

メタデータを関数に割り当て、後で確認する方法はありますか?タイプで定義を検査するときにそれを取得することは可能ですか?


1
ない溶液(それゆえコメント)が、私の仕事の周りの使用がかどうかをチェックするためで$1あり-h、そしてprintf/ echo1ラインヘルプ/使い方/何でも。
John N、

回答:


13
function func_name()
{
  : '
  Invocation:   func_name $1 $2 ... $n
  Function:     Display the values of the supplied arguments, in double quotes.
  Exit status:  func_name always returns with exit status 0.
  ' :
  local i
  echo "func_name: $# arguments"
  for ((i = 1; i <= $#; ++i)); do
    echo "func_name [$i] \"$1\""
    shift
  done
  return 0
}

2
うーん、bashのdocstrings。誰かわかったね?
Brian Minton 2016

そのコメントをクエリする方法はありますか?私はすべてのコマンドに対して寛大なヘルプ機能を考えています。
yucer

7

はい、type実行される関数の一部のみを出力するようです。これは私にとっては理にかなっているように思えます。通常、クエリを実行するときに関心があるのはそれだけだからですtype

回避策として、コメントを使用する代わりに、次のようにメタデータを追加します。

func1() {
    meta="This function was generated for project: PROJECT1"
    echo "do my automation"
}

実際にその変数を使用する必要はありませんが、次のようにして関数をクエリすると表示されtypeます。

$ type func1
func1 is a function
func1 () 
{ 
    meta="This function was generated for project: PROJECT1";
    echo "do my automation"
}

2
変数の保存を避けたい場合は、nop演算子 ":"を次のように使用できます
。function

1
ドキュメントストリングに不要な展開が隠れている場合に備えて、ここでは一重引用符が二重引用符よりも優れていると思います
Digital Trauma

6

組み込みのnopを使用できます:。その上、それを変数として保存する必要はありません:

function f() {
  : your metadata here
  : "or here"
  # do yours
}

編集:メタデータへの特殊文字の使用に注意してください。純粋なテキストの場合、以下を使用できます。

: <<EOT
Your metadata text here.
EOT

編集:代わりにグローバル連想配列を使用して、すべての関数のメタデータを保存できます:

declare -A METADATA=()
METADATA[fun1]='foo bar'
function fun1() {
  echo I have some metadata: "${METADATA[$FUNCNAME]}"
}
METADATA[fun2]='baz you'
function fun2() {
  echo I have some other metadata: "${METADATA[$FUNCNAME]}"
}

この方法では、出力を解析しdeclareたりtype、出力したりする必要はありませんが、配列のキーを照会するだけです。


1
注意してください- your metadata here副作用のある展開が含まれる可能性があります。@AlexPの回答のように一重引用符を使用することをお勧めします。
Digital Trauma

はい。ただし、引用符の内側にも注意が必要です。
Luchostein、2016

3

あなたはこれを行うことができます。

$ f() { This function does nothing. 2> /dev/null; }
$ f
$ type f
f is a function
f () 
{ 
    This function does nothing. 2> /dev/null
}

しかし、関数は注釈が付けられた後もその機能を実行する必要があります。サンプルに含めたサンプルでは、​​関数を通常どおり呼び出してもエコーが機能するはずです。
yucer 16

@yucerそうでしょう。これは単なる例です。それを試してみてください。ただし、制限があります。などの特殊文字(は使用できません。また、最初の単語は有効なコマンドであってはなりません。

OK。実行には余分な時間がかかりますが、それは有効な答えだと思います。また、この例で使用したエコーとメタデータを含めるとよいでしょう。
yucer 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.