コンソールアプリケーションに引数を渡すさまざまな方法

コンソールアプリケーションに引数を渡すさまざまな方法

コンソール アプリケーションが引数を次のいずれかで開始するのはなぜですか。

a) one dash (myapp -arg1 123; ls -al)
b) two dashes (myapp --arg1 123; git push origin master --force)
c) without dashes at all (myapp 123; man ls)
d) without dashes but with the equal sign (myapp arg1=123; dd if=/dev/zero)

標準的な慣例はないのでしょうか? 標準的な Linux アプリケーションでも、3 つのケース (a)、(b)、(d) が同時に存在します。また、たとえば、-help と --help のどちらを使用すればよいのかを覚えておくのは困難です。

答え1

ダッシュは以下を示すために使用されますオプション、コマンドの動作を変更します。ダッシュのない引数はコマンドの主なパラメータを示し、多くの場合ファイル名です。

通常、単一のハイフンは、1 文字のみで構成されるオプションを表します。複数のオプションをグループ化できるため、 とls -a -l省略できますls -al。これは、ほとんどの初期の Unix コマンドの標準的な規則でした。

二重ハイフンは、完全な単語であるオプションを表します。この規則は、上記のグループ化と区別するために必要です。このオプション スタイルは、ユーティリティの GNU バージョンで普及しました。これは、ユーティリティの機能が非常に多いため、単一の文字で表すニーモニックが不足することが多いためです。

オプションによっては、独自のパラメータが必要になる場合があります。そのスタイルはさまざまです。コマンドによっては-o parameter、 、 を使用するものが-oparameterあり--option=parameter、複数の形式を許可するものもあります。

独自の、独特な引数スタイルを発明したコマンドもいくつかあります。これらは通常、引数の規則に関する合意ができる前の非常に古いコマンドです。この例としては、tarと がありますdd。は、規則が作成されるfind前から完全な単語オプションを使用していた古いコマンドであるという点でも珍しいものです--。その引数は、そのニーズが一般的なパラダイムに適合しないため、事実上独自の言語ですcommand -options parameters

コマンド間で差異が生じるもう 1 つの理由は、Unix には元々引数解析ライブラリ関数がなかったことです。関数getoptgetopts関数が作成されたのは、Unix が誕生してかなり経ってからでした。これらのライブラリを使用すると、基本的に一般的な方法に従う必要があります。しかし、古いプログラムでは独自のアドホック引数解析が行われ、プログラマによって決定が異なりました。

答え2

@Barmar は正しいですが、いくつかの情報が欠けています。実際にこれが起こる理由は、プログラムのコードがどのように記述されたか、より具体的には、引数を解析するために何が使用されたかにのみ起因します。

これについてさらに詳しく説明する前に、用語について説明しておきます。まず、「オプション」と呼ばれるものは、実際には引数でもあります。実際、コマンド ラインに入力するものはすべて引数です (プログラム名も含む)。これらの引数は通常、配列 ( argvC では配列と呼ばれます) に格納されます。次に、プログラムはこれらの引数を解析する方法 (または解析するかどうか) を選択し、それに応じて動作します。引数は通常、次の 3 つの形式のいずれかになります。

  1. フラグ (引数を取らず、単に動作をオンまたはオフにする)
  2. スイッチ (引数を受け取り、引数に基づいて動作を変更する)
  3. パラメータ(動作を変更することを意図しないプレーンデータ)

1および は、プログラムの動作を変更するために2よく および と呼ばれますOPTIONSが、どちらも異なるスタイルで表示されます (Barmar も言及しています)。C のgetoptライブラリでは、この領域でかなりの柔軟性が実現されています。慣例的に、オプションは 1 つのハイフンが前に付いた 1 文字または 2 つのハイフンが前に付いた完全な単語として指定されますが、 で記述されたプログラムでは、getopt実際には次のいずれも同等になります ( がインデックスとしてhelp指定されていると仮定)。h

-h、、--h--help

しかし、-helpは実際には では許可されていませんgetopt(したがって、ツールが-help使用フラグに を使用する場合、そのツールはライブラリを使用して作成されていないとほぼ確信できますgetopt)。これは、 が 1 つのハイフンを結合されたオプションのリストを示すものとして解釈するため、としてgetopt解釈されるためです。-help-h -e -l -p

さらに、オプションが引数を取る場合(慣例的に「optargs」と呼ばれる)、それを指定する方法はいくつかあります。次の例の場合、のインデックスはoptですoそして、それにはoptoptargが必要です¹—すべて同等です:

-oParameter、、、-o Parameter--opt=Parameter--opt Parameter

ライブラリは現在広く使用されている標準ですがgetopt、それより前の多くのツール (などtar) は依然として独自の解析設定を使用しているため、 は とtar -xjf同等になりますtar xjf


要約:getoptは昔からあるわけではないので、プログラマーは独自の方法で引数を解析する必要がありました。しかし、新しいツールでは通常これが使用されるため、その動作は正常で予測可能です。


1 あまり文書化されていないが、optargをオプションに使用できるが、必要とする1. オプションの optargs は、さまざまな厄介な問題を引き起こし、オプションを指定する一般的な方法のいくつかを無効にします (あいまいになるため)。幸いなことに、オプションの引数を取る引数はあまり一般的ではありません。

答え3

オプションはダッシュで始まり、通常は1文字ですが、複数のオプションを指定することもできます。

ls -l -h 
or
ls -lh

オプションは2つのダッシュで始まり、通常は単語を取ります。複数のオプションは機能しません。

ls --list --human

関連情報