28

ラッパー スクリプト${1:+"$@"}では、単に"$@".

たとえば、http://svn.macosforge.org/repository/macports/trunk/dports/editors/vim-app/files/gvim.sh

exec "$binary" $opts ${1:+"$@"}

誰か${1:+"$@"}が英語に分解して、それがプレーンよりも優れている理由を説明できます"$@"か?

4

3 に答える 3

26

「ヒステリックレーズン」、別名歴史的理由。

JesperE(またはシェルパラメーターの拡張に関するBashのmanページ)からの説明は、JesperEの機能について正確です。

  • $1存在し、空の文字列でない場合は、引用符で囲まれた引数のリストに置き換えます。

20年ほど前に、Bourne Shellの壊れたマイナーなバリアントの中には、引数がない場合に、何も置き換えないという現在の正しい動作ではなく、空の文字列""を置き換えたものがあります。"$@"そのようなシステムがまだ使用されているかどうかは、議論の余地があります。

[うーん:その拡張は次の場合には正しく機能しません:

command '' arg2 arg3 ...

このコンテキストでは、正しい表記は次のとおりです。

${1+"$@"}

$1これは、引数が空であるかどうかに関係なく正しく機能します。そのため、誰かが表記を誤って覚えていて、誤ってバグを導入してしまいました。]

于 2008-09-30T20:50:37.663 に答える
3

bash の man ページから:

   ${parameter:+word}
          Use Alternate Value.  If parameter is null or unset, nothing  is
          substituted, otherwise the expansion of word is substituted.

したがって、が設定"$@"されていない限り、 が置換され$1ます。なぜ彼らがただ使うことができなかったのか、私にはわかりません"$@"

于 2008-09-30T19:43:48.963 に答える
3

Jonathan Lefflerがコメントで言及しman bashた情報の関連部分を引用すると、次のようになります。

部分文字列の展開を実行しない場合、bash は未設定または nullのパラメーターをテストします。コロンを省略すると、設定されていないパラメータのみがテストされます。

(私のものを強調)

于 2009-10-21T16:03:17.890 に答える