オプションとパラメーターの間のスペースを省略できるのはなぜですか?


16

例えば:

xargs -n 1

と同じです

xargs -n1

しかし、manページを見ると、オプションはとしてリストされています-n max-args。これは、スペースが保存されることになっていることを意味します。短縮形-n max-argsについては何もありません。

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

Linuxではこれは何と呼ばれますか?すべてのユーティリティは省略形をサポートしていますか(ただし、マニュアルページに記載しないでください)?


1
12.1.2.aは歴史の一部です。これについてはすでに良い質問があると断言しますが、まだ見つけていません。

2
@drewbennあなたが考えている他の質問は私のものかもしれません:unix.stackexchange.com/q/188046/41515

回答:


12

コードのコマンドライン解析ビットを記述するとき、どのオプションが引数を使用し、どのオプションが引数を使用しないかを指定します。たとえば、-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つのオプションを解析するために期待してい、と言う-a-h、および-a引数取る必要があります」(それはだ:a、パーサー伝え-a引数を取りますが)。

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

実行する:

$ 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

これが、ほとんどの場合、オプションを解析するための独自のコマンドラインパーサーを書くべきではない理由です。

この例では、注意が必要なケースは1つだけです。解析は、通常、最初の非オプションで停止しますので、コマンドライン上のものを持っているとき、そのルックスのオプションのように:

$ 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ビットは、それが(それは位置変数の一つにあります)を望んでいるものは何でもするプログラムのために残されています。

つまり、ファイル名の先頭にが付いているダッシュを含むファイルを削除する方法ですrm

編集

C呼び出しgetopt()(で宣言unistd.h)で記述されたユーティリティは、ほぼ同じ方法で動作します。実際、私たちが知る限り、このbash関数getoptsはCライブラリ関数の呼び出しを使用して実装できますgetopt()。Perl、Python、および他の言語には、同様のコマンドライン解析ライブラリがあり、ほとんどの場合、同様の方法で解析を実行します。

これらgetoptおよびgetopt-likeライブラリルーチンの一部は、「長い」オプションも処理します。通常、これらの前には二重ダッシュ(--)が付き、引数を取る長いオプションは、等号の後にしばしば続きます。たとえば--block-size=SIZEduユーティリティの[一部の実装]オプション(-B SIZE同じものを指定することもできます)。

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

編集:やユーティリティなどの本当に古いツールには、ダッシュなしのオプションがあります。これは、純粋に歴史的な理由と、まさにその方法で動作するためにそれらに依存するソフトウェアとの互換性を維持するためです。このユーティリティは、最近ではダッシュ付きのオプションを選択できるようになりました。BSDマニュアルでは、「バンドルフラグ」の古いスタイルのオプションを呼び出しています。ddtartartar


この機能は、bashスクリプトで簡単に実装できそうです。しかし、私はほとんどのユーティリティはbashではなくCで書かれていると考えています。これらのユーティリティがこの機能を実装するのはなぜですか?
-J.ジョー

@ J.Joe彼らはgetopt()(で宣言されているunistd.h)を呼び出すので、同じことをします。
クサラナナンダ

2
うん、あなたは正しい。リファレンス。これは、オプションを組み合わせることができるという別の謎も解決します-a -b=== -ab
J.Joe

1
フラグのオプションの引数はあいまいさを生むため、それらを結合することはできません(-aオプションの引数がある場合、-abとは異なります-a -b)。GNU getoptは、非フラグに会うときにフラグの処理を停止しません:代わりに(デフォルトで)、代わりにargvの前にフラグを再配置します。
-ilkkachu

@ilkkachuその説明をありがとう。回答を後で更新する場合があります。
クサラナナンダ

4

xargsPOSIXユーティリティの1つです。@drewbennによってコメントとして、POSIXの文書オプションの解析のための行動を最もそのユーティリティのが一致するgetopt、他の実装のためのいくつかの手当と、に言っ12.1ユーティリティの引数の構文

このセクションでは、標準ユーティリティの引数構文について説明し、ユーティリティによって処理される引数を説明するためにPOSIX.1-2008全体で使用される用語を紹介します。

POSIX.1-2008内では、ユーティリティの引数の構文を記述するために特別な表記法が使用されます。特に断りのない限り、すべてのユーティリティの説明では、この例で示されているこの表記法を使用しています(XCU Simple Commandsを参照)。

と結論

将来のすべてのユーティリティとアプリケーションでは、これらのガイドラインを使用してユーザーの移植性を強化することをお勧めします。(既存のアプリケーションの破損を避けるために)いくつかの歴史的なユーティリティを変更できなかったという事実は、この将来の目標を妨げるものではありません。

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

POSIXでは、オプションのオプション値を使用できます。

オプション引数は<blank>、オプション引数がオプションであることを示すために'['and ']'表記で囲まれている場合を除き、オプションと文字で区切られて表示されます。

ちなみに、どのPOSIXユーティリティがこの機能を使用しているかは思い出せません。ncurses ticinfocmpユーティリティは、(verbose / debug)オプションのレベルの機能を使用し-vます。

あなたが尋ねた特定のポイントは、その段落の残りの部分で詳しく説明されており、数行続きます。

POSIXより前はps、先頭にハイフンのない受け入れられたオプションのいくつかの実装。POSIXの説明では、ユーティリティの説明や構文の根拠に言及していません。

POSIXの他に、オプションの値をオプションに分離または結合するためのさまざまな方法を使用する長いオプションの実装(GNU getopt_longまたはX Toolkitなど)があります。たとえば、句読点を使用できます。

--option=value
--option value

実装によっては、長いオプションと短いオプション(getopt)を区別するために二重ダッシュを使用する場合と使用しない場合があります。lynxとX Toolkitは単一のダッシュを使用します。getopt_long例えば、GNU は二重ダッシュを使用します。また、+オプションが否定されていることを示すために使用される場合があります。

POSIXの説明はこれらのいずれにも言及していないように見えますが、それらに遭遇する可能性は確かにあります。


される-option=valueことになって--option=value(長いオプション形式ではなく、一つの初めに2つのダッシュ)?
J.Joe

いくつかのレガシーユーティリティは、単一ダッシュの長いオプション(-option)を使用しますが、新しいスクリプトとプログラムではほとんど使用されていません。getoptで処理される短いオプションには単一ダッシュを使用します。ほとんどすべての新しいスクリプトおよびプログラムは、二重ダッシュの長いオプションを使用します。多くの場合、最も一般的に使用されるものと同等の単一ダッシュの短いオプションもサポートしています。長いオプションを使用すると、スクリプトコードがはるかに自己文書化され、必要なコメントが少なくなります。
DocSalvager
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.