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

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

たとえば、

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では、以前のスタイルオプションを「バンドルフラグ」と呼びます。

おすすめ記事