いくつかのユーティリティがオプションの前にオペランドを解析するのはなぜですか?

いくつかのユーティリティがオプションの前にオペランドを解析するのはなぜですか?

~によると一部 源泉、UNIXユーティリティガイドでは、オペランドは常にオプションの後に処理する必要があることを指定します。

utility_name[OPTIONS][operands...]

たとえば、一部の古いUNIXユーティリティはこれらの規則に正確に従わないことが知られていますが、よりfind新しく、より確立されたユーティリティも明確な説明なしに規則に違反しますcurl <url>

これに正当な理由があるのか​​、それに対する一般的なコミュニティの合意は何であるかを知りたいです。

ベストアンサー1

一般的な規則は、パラメータが常にオプションの後にあることです。オプションではなく最初の文字列(で始まらないコマンドラインの最初の文字列-)はオプションを終了して引数を開始します。

一部のツール、特にビルドツール(コンパイラ、リンカ)は常にこの規則に違反します。注目すべきもう1つの例は、findオプションがコマンドラインに表示されるたびに適用されるために実行される場合もあるため、オプションの前後に引数を指定する方法が必要です。ここでのオプションは、引数が次に現れる場合にのみ適用されます。オプションはこのパラメータにのみ適用されます。

このルールを使用すると、次の行を含むシェルスクリプトを作成できます。

rm foobar ${more_things_to_remove}

...そして、rmシェル変数に ""などの不快な値があっても、誤ってmore_things_to_removeコマンドにオプションを追加しないようにします-rf

--このルールは、オプション処理を終了するために特別なオプションを使用する最近のルールよりも優先されます。--オプションの終わりを明示的に表示するより良い方法は次のとおりです。

rm -- foobar ${more_things_to_remove}

# and it works even if you don't need to delete something called "foobar":
rm -- ${more_things_to_remove}

だから最近(そして最近はこれが長年続いていることを意味します)、より多くのコマンドラインパーサーが前の規則を破り、オプションと引数がどこでも明確に混在することを可能にする方向に動いているようです(常に強制終了--オプション)私は他のツールのようにルールを破る特別な理由がなくても同じです。

個人的には、どのユーティリティがまだルールに準拠していて、どのユーティリティがそうでないかを知ることができないので、常に以前のように引数の前にオプションを配置し、他の人の作業コードがこれを逆順に実行するのを見て、少し驚きました!

おすすめ記事