C レベルでは、プログラムのコマンド ライン引数は、main
関数のパラメーターに表示されます。たとえば、このプログラムをコンパイルすると、次のようになります。
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
for (i = 0; i < argc; i++)
printf("argv[%d] = %s\n", i, argv[i]);
return 0;
}
サンプルの「rm」コマンドと同じ引数で呼び出すと、次のようになります。
$ ./a.out -Rf test
argv[0] = ./a.out
argv[1] = -Rf
argv[2] = test
ご覧のとおり、最初のエントリargv
はプログラム自体の名前で、残りの配列エントリはコマンド ライン引数です。
オペレーティング システムは、引数が何であるかをまったく気にしません。それらを解釈するのはあなたのプログラム次第です。ただし、それらがどのように機能するかについては規則があり、その中で最も重要なものは次のとおりです。
- 引数はオプションと非オプションに分けられます。オプションはダッシュで始まり、非オプションはそうではありません。
- 名前が示すように、オプションはオプションであると想定されています。あなたのプログラムが何らかの有用なことを行うためにいくつかのコマンドライン引数を必要とする場合、それらの引数は非オプションであるべきです (つまり、ダッシュで始まってはいけません)。
- オプションはさらに、1 つのダッシュの後に 1 つの文字 ( , )が続く短いオプションと、2 つのダッシュの後にダッシュで区切られた 1 つ以上の単語が続く長いオプション ( , ) に分けることができます。短いオプションは、引数を取らない限り、1 つの引数 ( ) にまとめることができます(以下を参照)。
-r
-f
--recursive
--frobnicate-the-gourds
-rf
- オプション自体が引数を取る場合があります。
- 短いオプションの引数は、エントリ
-x
の残りの部分か、そのargv
エントリにそれ以上のテキストがない場合は、ダッシュで始まるかどうかargv
に関係なく、次のエントリです。
- 長いオプションへの引数は、等号で設定されます:
--output=outputfile.txt
.
- 可能であれば、個別のオプション (引数を含む) の相対的な順序付けは、目に見える影響を与えるべきではありません。
- 特別なオプション
--
は、「コマンド ラインのこの時点以降は、オプションのように見えても、何も扱わない」ことを意味します。これは、たとえば、「-f
」と入力して「 」という名前のファイルを削除できるようにするためですrm -- -f
。
- 特別なオプション
-
は、「標準入力を読み取る」ことを意味します。
- 慣例により予約されている短いオプション文字がいくつかあります。最も重要なものは次のとおりです。
-v
= 冗長
-q
=静かにして
-h
= ヘルプ テキストを印刷する
-o
file = ファイルへの出力
-f
= force (危険なアクションの確認を求めるプロンプトを表示せず、実行するだけです)
コマンドライン引数の解析に役立つライブラリがたくさんあります。これらの中で最も移植性が高く、また最も制限されているのはgetoptです。これは、最近のほとんどのシステムで C ライブラリに組み込まれています。特定のドキュメントを使用したくない場合でも、 GNU argpのすべてのドキュメントを読むことをお勧めします。
rm -rf *
ワイルドカード展開 ( ) は、プログラムが呼び出される前に行われることにも言及する価値があります。上記のサンプル プログラムを./a.out *
、バイナリとそのソース コードのみを含むディレクトリで実行すると、次のようになります。
argv[0] = ./a.out
argv[1] = a.out
argv[2] = test.c