例えば:
xargs -n 1
と同じです
xargs -n1
しかし、manページを見ると、オプションはとしてリストされています-n max-args。これは、スペースが保存されることになっていることを意味します。短縮形-n max-argsについては何もありません。
これは、他の多くのLinuxユーティリティでも発生します。
Linuxではこれは何と呼ばれますか?すべてのユーティリティは省略形をサポートしていますか(ただし、マニュアルページに記載しないでください)?
例えば:
xargs -n 1
と同じです
xargs -n1
しかし、manページを見ると、オプションはとしてリストされています-n max-args。これは、スペースが保存されることになっていることを意味します。短縮形-n max-argsについては何もありません。
これは、他の多くのLinuxユーティリティでも発生します。
Linuxではこれは何と呼ばれますか?すべてのユーティリティは省略形をサポートしていますか(ただし、マニュアルページに記載しないでください)?
回答:
コードのコマンドライン解析ビットを記述するとき、どのオプションが引数を使用し、どのオプションが引数を使用しないかを指定します。たとえば、-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=SIZE、duユーティリティの[一部の実装]オプション(-B SIZE同じものを指定することもできます)。
マニュアルが短いオプションとその引数の間のスペースを示すためにしばしば書かれている理由は、おそらく読みやすさのためです。
編集:やユーティリティなどの本当に古いツールには、ダッシュなしのオプションがあります。これは、純粋に歴史的な理由と、まさにその方法で動作するためにそれらに依存するソフトウェアとの互換性を維持するためです。このユーティリティは、最近ではダッシュ付きのオプションを選択できるようになりました。BSDマニュアルでは、「バンドルフラグ」の古いスタイルのオプションを呼び出しています。ddtartartar
getopt()(で宣言されているunistd.h)を呼び出すので、同じことをします。
-aオプションの引数がある場合、-abとは異なります-a -b)。GNU getoptは、非フラグに会うときにフラグの処理を停止しません:代わりに(デフォルトで)、代わりにargvの前にフラグを再配置します。
xargsPOSIXユーティリティの1つです。@drewbennによってコメントとして、POSIXの文書オプションの解析のための行動を最もそのユーティリティのが一致するgetopt、他の実装のためのいくつかの手当と、に言っ12.1ユーティリティの引数の構文:
このセクションでは、標準ユーティリティの引数構文について説明し、ユーティリティによって処理される引数を説明するためにPOSIX.1-2008全体で使用される用語を紹介します。
POSIX.1-2008内では、ユーティリティの引数の構文を記述するために特別な表記法が使用されます。特に断りのない限り、すべてのユーティリティの説明では、この例で示されているこの表記法を使用しています(XCU Simple Commandsを参照)。
と結論
将来のすべてのユーティリティとアプリケーションでは、これらのガイドラインを使用してユーザーの移植性を強化することをお勧めします。(既存のアプリケーションの破損を避けるために)いくつかの歴史的なユーティリティを変更できなかったという事実は、この将来の目標を妨げるものではありません。
POSIX内では(最も一般的に使用されるユーティリティのみを対象とすることに注意してください)、他のユーティリティのオプションとなるオペランドを位置パラメータまたは特別な構文のパラメータとして渡す例外があります。
POSIXでは、オプションのオプション値を使用できます。
オプション引数は
<blank>、オプション引数がオプションであることを示すために'['and']'表記で囲まれている場合を除き、オプションと文字で区切られて表示されます。
ちなみに、どのPOSIXユーティリティがこの機能を使用しているかは思い出せません。ncurses ticとinfocmpユーティリティは、(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つのダッシュ)?