オプションと引数の間のスペースを省略できるのはなぜですか?

オプションと引数の間のスペースを省略できるのはなぜですか?

たとえば、

xargs -n 1

同じですか?

xargs -n1

しかし、あなたが見るとマニュアルページ、オプションはでマークされているため、-n max-argsスペースを予約する必要があります。短縮型-nには何もありません。最大パラメータ

これは他の多くのLinuxユーティリティでも発生します。

Linuxではこれを何と呼びますか?すべてのユーティリティは短縮形式をサポートしています(ただし、マニュアルページに文書化しないでください)。

答え1

コードのコマンドライン解析ビットを作成するときに引数を使用するオプションと、引数を使用しないオプションを指定できます。たとえば、-hオプション(例:ヘルプ)と-a引数を取るオプションを受け入れるシェルスクリプトでは、次のことができます。

opt_h=0     # default value
opt_a=""

while getopts 'a:h' opt; do
    case $opt in
        h)  opt_h=1 ;;
        a)  opt_a="$OPTARG" ;;
    esac
done

echo "h: $opt_h"
echo "a: $opt_a"

このa:hビットは、「2つのオプションを解析することを期待しており、1つの引数を-a受け入れる必要があります」と言います(パーサーに1つの引数を受け入れるように指示します)。-h-a:a-a

したがって、1つのオプションが終わる場所、その値が始まる場所、およびその後に別のオプションが始まる場所について、あいまいさはまったくありません。

実行してください:

$ bash test.sh -h -a hello
h: 1
a: hello

$ bash test.sh -h -ahello
h: 1
a: hello

$ bash test.sh -hahello
h: 1
a: hello

これがほとんどの場合、オプションを解析するために独自のコマンドラインパーサーを作成してはいけません。

この例には、ただ一つの厳しい状況があります。解析は通常、オプションではなく最初の項目で停止するため、コマンドラインに何かがある場合そうだお気に入りのオプション:

$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello

以下は問題を解決します。

$ bash test.sh -a hello -- -world
h: 0
a: hello

この--信号はコマンドラインオプションの終わりを通知し、-worldプログラムが必要に応じて実行できるようにビットを残します(位置変数の1つにあります)。

ちなみに、ファイル名の先頭にダッシュがあるファイルを削除する方法ですrm

編集する:

C呼び出しで書かれたユーティリティgetopt()(Resourcesで宣言されていますunistd.h)は、ほぼ同じように動作します。実際、私たちが知っている限り、このbash機能はgetoptsCライブラリ関数を呼び出すことで実装できますgetopt()。 Perl、Python、およびその他の言語には、同様のコマンドライン解析ライブラリがあり、同様の方法で解析を実行する可能性が高くなります。

これらのライブラリルーチンgetoptgetopt似たライブラリルーチンの一部は、「長い」オプションも処理します。これらはすべて通常二重ダッシュ()の前に引数を受け入れる長いオプションは、通常、ユーティリティ--(一部の実装)--block-size=SIZEのオプション(同じ指定もdu許可)のように等号が前に続きます。-B SIZE

マニュアルでしばしば短いオプションと引数の間にスペースを表示する理由は、おそらく読みやすさによるものです。

編集する:本物以前のツール(ユーティリティddなどtar)のオプションの前にはダッシュはありません。これは、純粋に歴史的な理由とこの方法で動作するソフトウェアとの互換性を維持するためです。tar最近のユーティリティでは、オプションにダッシュを使用できるようになりました。 BSDマニュアルtarでは、以前のスタイルオプションを「バンドルフラグ」と呼びます。

答え2

xargsPOSIXユーティリティの1つです。 @drewbennが述べたように、POSIXはオプションの解析動作を文書化します。最大ユーティリティマッチgetopt、他の実装に対するいくつかの許可と一緒に次のように言います。12.1実際のパラメータ構文:

このセクションでは、標準ユーティリティのパラメータ構文を説明し、ユーティリティが処理するパラメータを説明するためにPOSIX.1-2008全体で使用される用語を紹介します。

POSIX.1-2008では、ユーティリティパラメータの構文を説明するために特殊記号が使用されています。特に明記しない限り、すべてのユーティリティ記述はこの表記法を使用し、この例ではこれを説明します(XCUを参照)。簡単なコマンド):

そして結論を​​出す

将来のすべてのユーティリティとアプリケーションでは、ユーザーの移植性を向上させるためにこのガイドラインを使用することをお勧めします。一部の過去のユーティリティを変更できないという事実(既存のアプリケーションの中断を防ぐため)は、将来の目標を妨げてはいけません。

POSIXでは、(最も一般的に使用されるユーティリティのみを扱うことに注意してください)、オペランド渡しの例外があります。オプション他のユーティリティの中で場所のパラメータまたは引数特別な構文:

POSIXは受け入れます任意に選択できるオプション値:

オプションパラメータがオプションであることを示すために、オプションパラメータがアンパサンドで<blank>囲まれていない限り、オプションパラメータはoptionsと文字で区切られます。'['']'

どのPOSIXユーティリティがこの機能を使用しているか覚えていません。呪いticそしてinfocmpユーティリティ会社はこの機能を次の目的に使用します。レベル-v(詳細/デバッグ)オプション。

あなたが尋ねる具体的な質問は、段落の残りの部分で複数行にわたって詳細に説明されています。

POSIX以前は、ps一部の実装ではハイフンなしでオプションを許可していました。 POSIX の説明では、ユーティリティーの説明や構文の根拠ではこれについては説明しません。

POSIXに加えて、長いオプションの実装があります(例:GNU選択項目を長く取得します。またはXツールキット)、オプションの値をオプションに分割またはリンクするさまざまな方法を使用します。たとえば、句読点を使用できます。

--option=value
--option value

実装によっては、長いオプションと短いオプション(getopt)を区別するためにデュアルダッシュを使用することも、使用しないこともあります。サルクXツールキットは単一のダッシュを使用します。たとえば、GNUはgetopt_longデュアルダッシュを使用します。また、a を+使用してオプションが無効になったことを示すこともできます。

POSIXの説明では、これらのいずれも言及されていないようですが、確かにこれらの問題が発生する可能性があります。

関連情報