[Linux]环境变量

环境变量

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,是操作系统为了满足不同的应用场景预先在系统内预先设置的一大批全局变量。

常用的环境变量

  1. PATH:指定了操作系统在查找可执行文件时搜索的目录列表,目录之间用冒号:分隔。当在命令行中输入一个命令时,操作系统会在PATH中列出的目录中依次查找该命令的可执行文件。
  2. HOME:用户的主目录路径。
  3. USER:当前用户的用户名。
  4. PWD:显示当前目录。
  5. SHELL:当前用户用的是哪种Shell。
  6. HISTSIZE:保存历史命令记录的条数。
  7. HOSTNAME:主机的名称,应用程序如果要用到主机名的话,通常是从这个环境变量中取得。
  8. LOGNAME:当前用户的登录名。

查看环境变量

  1. echo:查看特定环境变量的值。

  2. env/printenv:列出所有的环境变量及其值。

  3. set:直接使用set列出当前 shell 中的所有变量和函数。这包括环境变量、局部变量、位置参数(命令行参数)以及 shell 函数。

    当直接在命令行定义变量时,就是临时变量,可以使用export将变量导入到全局变量中。

添加环境变量

在用户的家目录(~)下,有.bash_profile.bashrc两个文件,当用户登录时系统会自动加载。

.bash_profile:通常在用户登录时被读取,用于设置特定于用户的环境变量和启动程序。

.bashrc:它包含了用户定义的别名、函数、自定义环境变量等。每当一个新的 Bash shell 启动时(包括非登录 shell,如在终端中打开新的窗口或启动一个新的 shell 会话),.bashrc文件会被读取。用于设置通用的 shell 配置,这些配置适用于所有的 Bash shell 会话,无论是否是登录 shell。

添加临时环境变量

export:这种方式设置的环境变量只在当前 shell 会话中有效。一旦关闭该 shell 或启动新的 shell,这个环境变量将不再存在。

注意:在添加新的环境变量到PATH的时候要将原来的环境变量带上(在路径后加上$PATH),否则的话就会直接覆盖原来的环境变量(若是不小心没有带,重新登录即可恢复)。

添加永久环境变量

针对特定用户

  1. 修改 .bashrc 文件或 .profile 文件或 .bash_profile 文件:
    • 这些文件通常位于用户的主目录(~)下。可以使用文本编辑器打开其中一个文件(一般推荐修改 .bashrc 文件,因为它在每次启动新的 Bash shell 时都会被读取)。
    • 在文件中添加以下内容来设置环境变量:export VAR_NAME=value。例如,要设置一个名为 MYENV_VAR 的环境变量并赋值为 /usr/local/myapp,可以在文件中添加 export MYENV_VAR=/usr/local/myapp
    • 保存文件后,为了使更改生效,可以在当前终端中运行 source ~/.bashrc(如果修改的是 .bashrc 文件)或重新打开一个新的终端窗口。
  2. 注意事项:
    • 这种方法只对当前用户有效。如果需要为系统中的所有用户设置永久环境变量,则需要使用系统级别的配置方法。

针对所有用户

  1. 修改 /etc/profile 文件或 /etc/environment 文件:
    • /etc/profile 文件在系统启动和用户登录时被读取,可用于设置系统范围的环境变量。
    • /etc/environment 文件也可以用于设置系统范围的环境变量,但它的语法更加严格,只接受 “环境变量名 = 值” 的形式,不支持在其中执行命令。
    • 使用文本编辑器打开其中一个文件,添加环境变量的设置,例如在 /etc/profile 文件中添加 export GLOBAL_VAR=/opt/shared
    • 更改这些文件通常需要管理员权限。保存文件后,新的环境变量将在下次系统启动或用户登录时生效。
  2. 注意事项:
    • 修改系统级别的配置文件需要谨慎,确保对文件的更改是正确的,以免影响系统的稳定性。
    • 在进行任何更改之前,最好备份这些文件,以便在出现问题时可以恢复到原始状态。

删除环境变量

临时删除

  1. 在当前 shell 会话中使用 unset 命令:
    • 基本语法是 unset VAR_NAME,其中 VAR_NAME 是要删除的环境变量的名称。
    • 例如,要删除名为 MYVAR 的环境变量,可以在终端中输入 unset MYVAR
    • 之后使用 echo $MYVAR 命令将不会输出任何内容,表明该环境变量已被删除。
  2. 注意事项:
    • 这种方法仅在当前 shell 会话中删除环境变量。如果打开新的 shell 窗口或重新登录,该环境变量可能会再次出现(如果它是在其他配置文件中设置的)。

永久删除

  1. 针对特定用户:
    • 如果环境变量是在用户的 .bashrc.profile.bash_profile 文件中设置的,可以使用文本编辑器打开相应的文件,找到设置该环境变量的行并删除它。
    • 例如,如果在 .bashrc 文件中有 export MYENV_VAR=/usr/local/myapp,删除这一行后保存文件。然后在当前终端中运行 source ~/.bashrc 使更改生效,或者重新打开一个新的终端窗口。
  2. 针对所有用户(系统范围):
    • 如果环境变量是在系统级别的配置文件如 /etc/profile/etc/environment 中设置的,需要使用管理员权限打开这些文件进行编辑。
    • 找到设置该环境变量的行并删除它。保存文件后,新的环境变量将在下次系统启动或用户登录时不再生效。
  3. 注意事项:
    • 在编辑系统级别的配置文件时要格外小心,确保对文件的更改是正确的,以免影响系统的稳定性。
    • 在进行任何更改之前,最好备份这些文件,以便在出现问题时可以恢复到原始状态。

在进程上下文中获取环境变量的三种方式

  1. getenv()

    函数原型:char *getenv(const char *name);

    在C/C++中getenv()接受一个字符串参数,表示要获取的环境变量的名称,获取成功返回一个指向该环境变量值的字符串指针,失败返回NULL

    使用示例

    int main()
    {
        char *path = getenv("PATH");
        if (path != NULL)
        {
            printf("environment variable is : %s\n", path);
        }
        else 
        {
            printf("environment is not found !!!\n");
        }
        return 0;
    }
    
  2. char* env[]

    char *env[] 声明了一个字符指针数组,数组的最后一个元素是 NULL 指针。数组中的每个元素都是一个指向字符的指针,而这些指针可以指向表示环境变量及其值的字符串。当一个程序启动时,操作系统会将环境变量信息以这种字符指针数组的形式传递给程序的 main 函数(作为 main 函数的第三个参数,不过这个参数是可选的,形式通常为 int main(int argc, char *argv[], char *env[]))。

    使用示例

    #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. char **environ

    它是一个指向字符指针数组的指针,和使用char *env[]类似,遍历environ数组时,数组的结尾是NULL指针。

    注意:libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。

    使用示例

    #include <stdio.h>
    int main()
    {
        extern char **environ;
        for (int i = 0; environ[i]; i++)
        {
            printf("environ[%d] : %s\n", i, environ[i]);
        }
        return 0;
    }
    
    
posted @   羡鱼OvO  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示