インタラクティブな使用のための関数に使用法の説明を表示する

インタラクティブな使用のための関数に使用法の説明を表示する

.bashrc端末で対話的に使用するためにmyで定義されたいくつかの関数があります。私は通常、その意図された用途を説明する説明を前に付けます。

# Usage: foo [bar]
# Foo's a bar into a baz
foo() {
  ...
}

ソースコードをナビゲートする場合は問題ありませんが、type関数が何をしているのかをすばやく覚えたい場合は、端末で実行する方が良いでしょう。しかし、これには(もちろん)コメントは含まれません。

$ type foo
foo is a function
foo ()
{
    ...
}

typeこれにより、「この注釈が持続し、Pythonの精神で表示できるとしたらいいのではないか?」と思いました。ドックストリング私はこれを思い出しました:

foo() {
  : Usage: foo [bar]
  : "Foo's a bar into a baz"
  ...
}

$ type foo
foo is a function
foo ()
{
    : Usage: foo [bar];
    : "Foo's a bar into a baz";
    ...
}

typeこれで使用量が出力に含まれます。もちろん、引用はエラーが発生しやすい問題になりますが、うまくいけばより良いユーザーエクスペリエンスを提供します。

だから私の質問はこれが悪い考えですか? Bash機能ユーザーに追加のコンテキストを提供するためのより良い選択肢(例:man/ for function)はありますか?info

理想的には、使用上のガイドラインが関数定義の近くにあり、ソースコードを見ている人も利点を得ることを望んでいますが、これを行うための「正しい」方法がある場合は、代替案が開いています。

編集するこれはかなり単純なヘルパー関数です。私はインタラクティブに追加のコンテキストを取得したかった。もちろん、フラグを解析するより複雑なスクリプトの場合はオプションを追加しますが、これらのスクリプトでは、--helpすべての項目にヘルプフラグを追加するのは少し面倒です。おそらくそれは私が受け入れる必要があるかもしれませんが、この:ハッキングは合理的にうまくいくようです。

答え1

私はこれを行う良い方法が1つしかないとは思いません。

多くの関数、スクリプト、およびその他の実行可能ファイルは、ユーザーが提供したり-hオプションで提供したりする場合にヘルプメッセージを提供します。--help

$ foo() {
[[ "$1" =~ (-h|--help) ]] && { cat <<EOF
Usage: foo [bar]
Foo's a bar into a baz
EOF
return;
}
: ...other stuff...
}

たとえば、

$ foo -h
Usage: foo [bar]
Foo's a bar into a baz

$ foo --help
Usage: foo [bar]
Foo's a bar into a baz

答え2

私は一度もかなり自分を説得して急落し、:コマンドを疑似コメントとして使用します。特に、「コメント」が実際に評価するパラメータであり、副作用がある可能性があること(またはバグなどの問題が発生する可能性がある')について心配しました。私はまだアイデアの単純さが好きですが、トレードオフは正当化できないと思います。

ロゴや同様のものを使ってテキストの使用を提案することを躊躇するのは--help常にそれに伴う問題でした。フラグを受け入れ始めると、通常(Bashで)必要な本格的なパラメータ解析にすばやく入ります。かなり多くの定型句

このギャップを部分的に埋めるために、小さなユーティリティプログラムgetoptsこの定型句を減らすにはラップします。まだ数行を占めているので、他の非常に小さな機能には使用しませんが、直接使用するよりもはるかにきれいですgetopts。以下はフラグを使用した使用例です-hgetopts単一文字オプションのみがサポートされています)。

foo() {
  local _usage='foo [-a] [-b] [-f val] [-v val] [args ...]'
  eval "$(parse_opts 'f:v:abh')"
  if (( h )); then
    echo "Usage: $_usage"
    return 0
  fi
  echo "f=$f v=$v a=$a b=$b -- $#: $*"
}

関連情報