[コマンドラインパラメータ]と[環境変数]

I.はじめに

C言語を学習する過程で、次のようなmain関数を見たことがあると思います。

int main(int argc, char *argv[], char *env[])

        ほとんどのパラメータには最初の 2 つのパラメータしかなく、いくつかのパラメータには 3 つのパラメータがあります。しかし、あなたは基本的にそれらを使用したことがなく、基本的にそれらが何であるかを確認したこともありません。これを見た皆さんには、操作方法の学習を完了することをお勧めします。システムとコマンド. 操作を実行した後に調べてみましょう. C 言語の学習には main 関数のパラメータは関係しないので、今は無視して問題ありません。

2. コマンドラインパラメータの内容と確認

main関数のパラメータを「コマンドラインパラメータ」といいます。

int main(int argc, char *argv[], char *env[])
  1. argc: コマンドライン内のスペースで区切られたパラメータの数。
  2. argv: コマンド ライン パラメーターの各パラメーターの最初の要素のアドレスを格納するポインター配列 (NULL で終了)
  3. env: 各環境変数の最初の要素のアドレスを格納するポインター配列 (NULL で終了)

では、これらのパラメータが何であるかを確認してみましょう。

1. [argc] と [argv]

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

ここで、パラメータargc がコマンド ラインに入力された文字列の数であり、文字ポインタ配列 argv がスペースで区切られたこれらの文字列の最初の要素のアドレスを格納していることが        わかります。

argc 制限を追加しない場合はどうなるでしょうか?

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

        コマンドライン上のこれらの文字はまだ出力されていることがわかり、この文字ポインター配列は NULL で終了していることがわかります。これがコマンド ラインの命令と非常によく似ていることがわかります。コマンド ラインの命令は、メイン パラメータであるコマンド ライン パラメータで構成されています。このようにして、独自の指示を作成することもできます。さまざまな機能は、それに続くさまざまなオプションによって実装されます。

2.環境

環境変数を表します。これも NULL で終了します

#include <stdio.h>
int main(int argc, char *argv[], char *env[]) 
{
    for(int i = 0; env[i]; ++i)
    {
        printf("env[%d] : %s\n", i, env[i]);
    }   
    return 0;
}

3. 環境変数

        まず、変数について理解しましょう。プログラミング言語のコードを書くとき、多くの変数を定義します。変数の定義の本質は、スペースを開いて、このスペースに名前を付け、内容を記述することです。したがって、今日学習する環境変数も同じ原理に基づいており、メモリ内に空間を開き、独自の名前と内容を持ちます。

        環境変数: 変数は複数ありますが、これらを総称して環境変数と呼びます。私たち一人一人が自分の名前を持っているのと同じように、私たちは集合的に「人々」と呼ばれます。環境変数間には関係はなく、オペレーティング システムに組み込まれている変数であり、特別な目的があります。

3.1 環境変数を表示する方法:

1. 指定された環境変数を表示する

echo $name //name -> 环境变量名

2. すべての環境変数を表示する

env

3.2 環境変数の作成と削除

export 环境变量名=值
unset name

3.3 プロセス内の環境変数を取得する

1. コマンドラインパラメータの取得

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[], char *env[])
{
    for(int i = 0; env[i]; ++i)
    {
        printf("***env[%d] : %s\n", i, env[i]);
    }
    return 0;
}

2. 指定した環境変数を取得するための関数呼び出し(よく使われる)

#include <stdio.h>
#include <stdlib.h>
int main()
{
    printf("%s\n", getenv("PATH"));
    return 0;
}

3. サードパーティ変数の取得

#include <stdio.h>
#include <stdlib.h>
int main()
{
    extern char **environ;
    for(int i = 0; environ[i]; ++i)
    {
        printf("environ[%d] : %s\n", i, environ[i]);
    }
    return 0;
}

3.4 テスト環境変数 PATH

PATH: コマンドの検索パスを指定します。

        コマンド ライン パラメーターに関する上記の研究に基づいて、命令と命令のさまざまなオプションがコマンド ライン パラメーターで構成されていることがわかります。したがって、命令の本質は実行可能プログラムです。実行可能プログラムを実行するには、パスを取得する必要があります。それがどこにあるか命令は、その命令が存在する場所のパスを取得する必要はありません。これは、命令を入力すると、環境変数 PATH でその命令が自動的に検索されるためです。見つかった場合は、直接実行します。見つからない場合は、見つからないことが表示されます。

1. 実行可能プログラムを命令に変換する

検索パスを PATH に追加します。

PATH=$PATH:程序所在路径

実行可能プログラムを PATH 内の任意のパスに配置します(ただし、作成した命令は十分に成熟しておらず、コマンド プールを汚染する可能性があるため、お勧めできません)。

3.5 環境変数についての話

        各プログラムには出力できる環境変数があるため、環境変数は実際にはグローバル変数です。これは、環境変数は子プロセスに継承でき、コマンド ラインで実行されるすべてのプログラムは bash の子プロセスであるためです。これらのプロセスによって継承されます。上記で PATH を理解すると、PATH 内の検索パスから検索するだけでコマンドを実行できることがわかります。

        では、オペレーティング システムはどのようにしてユーザーのいるパスを認識するのでしょうか? これは環境変数 PWD によって提供されます。

        オペレーティング システムは、環境変数 USER に基づいてユーザーが誰であるかを認識します。

        ログインすると、環境変数 HOME に基づいて、デフォルトでホーム ディレクトリに入ります。

        したがって、環境変数はユーザー関連の情報をオペレーティング システムに提供します。しかし、現在わかっている環境変数はメモリ レベルです。つまり、ログインするたびに環境変数は再初期化されます。つまり、最後のログイン時の環境変数の変更は、 2回目のログイン。

        それでは、ログインするたびに、誰が bash 環境変数を与えるのでしょうか?

        これはディスク上のファイル (ホーム ディレクトリの .bash_profile) である必要があり、ログインするたびに、このファイルの内容が bash に渡されます。

3.6 環境変数の意味

        環境変数の意味の 1 つについて簡単に説明すると、getenv の USER に基づいてユーザーの ID を識別し、そのユーザーが特定のコードを実行する権限を持っているかどうかを確認できます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    if(strcmp("wyd", getenv("USER")) == 0)
    {
        printf("I am wyd , you can do ...\n");
        //wyd代码
    }
    if(strcmp("root", getenv("USER")) == 0)
    {
        printf("I am root , you can do ...\n");
        //root代码
    }
    return 0;
}

4. ローカル変数

        これは環境変数ではなく、子プロセスに継承できず、グローバル プロパティを持たず、bash 内でのみ有効です。

        ローカル変数を定義します。name=val だけです。

        変数を表示するには、set を使用します。Set はローカル変数と環境変数の両方を表示できます。

        変数の削除: 名前の設定を解除

おすすめ

転載: blog.csdn.net/2302_76941579/article/details/135158213