Bash

在旨在互動使用的函式中顯示使用註釋

  • April 13, 2020

我在 my 中定義了許多函式.bashrc,旨在在終端中以互動方式使用。我通常在它們之前加上描述其預期用途的評論:

# 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/函式)?info

理想情況下,我仍然希望將使用說明放在函式定義附近,以便查看原始碼的人也能從中受益,但如果有“正確”的方法可以做到這一點,我願意接受替代方案。

編輯這些都是相當簡單的輔助樣式函式,我只是希望以互動方式獲得一些額外的上下文。當然,對於解析標誌的更複雜的腳本,我會添加一個--help選項,但對於這些腳本來說,向所有內容添加幫助標誌會有些負擔。也許這只是我應該接受的成本,但這種:hack 似乎工作得相當好,而不會使原始碼更難閱讀我們的編輯。

我不認為只有一種好方法可以做到這一點。

-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

我從來沒有完全說服自己冒險並使用:命令作為偽註釋。特別是,我一直擔心“評論”實際上是要評估的參數,並且可能會產生副作用(或只是破壞事物,例如錯誤的')。我仍然喜歡這個想法的簡單性,但從未發現這種權衡是合理的。

我對通過標誌或類似方式提供使用文本的猶豫--help一直是隨之而來的麻煩。一旦你開始接受標誌,你很快就會進入成熟的參數解析,這通常(在 Bash 中)需要相當多的樣板文件。

為了部分彌補這個差距,我將一個小實用程序組合在一起getopts,以減少這個樣板。它仍然佔用幾行程式碼,所以我不會在其他很小的函式中使用它,但它比getopts直接使用要簡潔得多。這是帶有-h標誌的範例用法(getopts僅支持單字母選項):

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 -- $#: $*"
}

引用自:https://unix.stackexchange.com/questions/295022