私はしばしば他のコマンドをラップするように設計されたシェル関数またはシェルスクリプトを書いています。
私はまた、そのようなラッパーがいくつかのフラグ/オプションをサポートしたいと思うことがよくあります。概念は、ラッパーがコマンドライン引数でサポートされているすべてのフラグ/オプション(該当する場合はその引数)を削除し、残りの引数をラップされたコマンドの引数として渡す必要があることです。
ラッパーコマンドはしばしば独自のフラグとオプションもサポートします。これは、上記のシナリオでは、ラッパーが独自のフラグ/オプションだけでなく、ラップされたコマンドでサポートされているフラグ/オプションを含むコマンドライン引数を処理できることを意味します。
これらのラッパーを実装する1つの方法は、GNUを呼び出すときにラッピングコマンドのラッパーとオプションを指定し、いくつかの配列で後者とオプションではない引数の両方を収集するgetopt
ことですWRAPPED_COMMAND_ARGUMENTS
。その後、後でラップされたコマンドが"${WRAPPED_COMMAND_ARGUMENTS[@]}"
そのコマンドライン引数で呼び出されます。
このアプローチは私に適していますが、ラップされたコマンドにオプションがたくさんあると非常に難しいかもしれません。
代わりに、私はこの記事のタイトルで「GNUに対する寛容的な選択肢」と呼ぶものを探したいと思いますgetopt
。私は明示的に指定したオプションを解析するのに役立つツールについて言及しており、残りのすべてのgetopt
引数を同じように扱います。つまり、先行ハイフンの有無によって区別しません。
そんなことありますか?
答え1
これらの操作に対する一般的なアプローチは、--
ラッパースクリプトによって処理されたオプションと、ラッパーが実行されているプログラムにそのまま渡されたオプションとの間の区切り文字として機能することです。
./my-wrapper -a -b -c -- -d -e -f
--
optionsの終わりを表示しますmy-wrapper
。他のすべての引数とそれに伴うすべてのオプションは--
ラップするプログラムに渡すことができ、ラッパースクリプトはこれをまったく処理する必要はありません。
また、オプションの競合する使用を許可します。たとえばgrep
、他の多くのプログラムは、-i
検索時に大文字と小文字を区別しないことを意味しますが、-i
ラッパースクリプトで入力ファイルを指定するために使用できます。使用すると--
競合はありません。以前は「入力ファイル」を意味し-i
、その後は「大文字と小文字を区別しない」を意味します。--
-i
--
また、注目すべき点は、ラップされたプログラムが終了すると解釈される可能性--
があることです。それオプションと--
ファイル名、文字列、またはその他のオプションではなく、引数の後のすべての項目(たとえば、optionsで始まるファイル名が-
オプションとして処理されるのを防ぎます)。
./my-wrapper -a -b -c -- -d -e -f -- non-option args here
ちなみに、--
少なくとも1970年代後半または1980年代初頭からオプションの終わりを表示するために使用されました。