18

私は旗が何であるかについての非常に簡単な説明/チュートリアルを探しています。フラグが機能することは、コマンドが何をすべきかを示していることを理解しています。例えば:

rm -Rf test

rmコマンドによってテストフォルダーが削除され、-Rfフラグによって、フォルダーだけでなくその中のファイルも強制的に消去されることがわかっています。

しかし、フラグはどこで読み取られ/コンパイルされますか?フラグを処理するものは何ですか?たとえば、独自のC / C ++プログラムを作成し、プログラムがさまざまなことを実行するようにさまざまなフラグを指定できますか?私は正しい質問をしていることを願っています。そうでない場合は、私に知らせてください。

4

7 に答える 7

19

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
于 2013-02-06T20:34:32.700 に答える
15

この単純なプログラムは、プログラムに渡される引数 (プログラム名自体を含む) を示す必要があります。

これらの引数の解析、解釈、および使用はプログラマー (あなた) 次第ですが、役立つライブラリがあります

int main(int argc, char* argv[])
{
    int i;
    for(i=0; i<argc; ++i)
    {   printf("Argument %d : %s\n", i, argv[i]);
    }
    return 0;
}

このプログラムを にコンパイルしa.out、次のように実行すると:

prompt$>  ./a.out ParamOne ParamTwo -rf x.c

次の出力が表示されます。

Argument 0 : a.out
Argument 1 : ParamOne
Argument 2 : ParamTwo
Argument 3 : -rf
Argument 4 : x.c
于 2013-02-06T20:26:22.767 に答える
6

実際には、次のようなコマンドライン パラメーターを受け入れる独自の C++ プログラムを作成できます。

int main(int argc, char* argv[]){}

変数 argc にはパラメーターの数が含まれ、char* にはパラメーター自体が含まれます。

次のようにパラメーターをディスパッチできます。

for (int i = 1; i < argc; i++)
{  
    if (i + 1 != argc)
    {
        if (strcmp(argv[i], "-filename") == 0) // This is your parameter name
        {                 
            char* filename = argv[i + 1];    // The next value in the array is your value
            i++;    // Move to the next flag
        }
    }
}
于 2013-02-06T20:23:13.517 に答える
2

独自の C プログラムでは、適切と思われる方法でコマンド ライン オプションを処理できます。C のコマンド ライン パラメーターは、main(int argc, char *argv[]) メソッドのパラメーターに文字列として含まれます。

また、ほとんどの UNIX コマンドと同様の方法でコマンド ライン パラメーターを処理したい場合、おそらく探している関数はgetopt()です。

幸運を!

于 2013-02-06T20:23:49.340 に答える
0

main()最も簡単なことは、あなたのように書くことです:

int main(int argc, char* argv[]) { ...

次に、そのメイン内で、コマンドライン引数または「フラグ」に何が起こるかを決定します。それらは argv にあり、それらの番号は argc です。

于 2013-02-06T20:22:03.767 に答える
0

フラグは、プログラムのメイン エントリ ポイントに渡される引数です。たとえば、C++ プログラムでは、

int main(int arc, char* argv[]){
return 0;
}

arc は渡された引数の数であり、ポインターは実際の引数のリストを提供します。だから

rm -Rf test

argc は 3 になり、argv 配列には引数が含まれます。プログラム名自体が (rm) をカウントするため、argc >= 1 であることに注意してください。-RF は 2 番目のパラメーターで、test は 3 番目のパラメーターです。

したがって、UNIX でコマンドを入力するときは常に、基本的にプログラムを実行し、プログラムが操作するパラメーターを渡しています。

unix OS に本当に興味があるなら、フォークとその仕組みを調べる必要があります。ただし、これは初心者にとってかなり混乱する可能性があるため、OS とプログラムの実行方法に本当に興味がある場合にのみ使用してください。

于 2013-02-06T20:22:18.570 に答える