`
isiqi
  • 浏览: 16487886 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Linux环境(二)--环境变量

阅读更多
环境变量

我们在第2章讨论了环境变量。这些变量可以用来控制shell脚本和其他程序的形为。我们也可以使用他们来配置用户环境。例如,每一个用户都有一个环境变量,HOME,定义了其用户主目录,作为其会话的起始位置。正如我们所知的,我们由shell提示来测试环境变量:

$ echo $HOME
/home/neil

我们也可以使用shell的set命令来列出所有的环境变量。

Unix描述定义了许多标准的环境变量用于各种目的,包括终端类型,默认编辑器,时区,等等。一个C程序可以使用putenv与getenv函数来访问环境变量。

#include <stdlib.h>
char *getenv(const char *name);
int putenv(const char *string);

环 境由name=value形式的字符串组成。getenv函数会查找由name所指定的环境,并且返回与其相关的值。如果所请求的变量不存,则会返回 null。如果变量存在但是却没有值,getenv函数会成功返回一个字符串,其第一个字节为null。由getenv函数所返回的变量存储在由 getenv所提供的表态存储区中,他不可被程序覆盖,因为他会由getenv的序列调用覆盖。

putenv函数的参数为一个name=value格式的字符串,并且将其添加到当前环境中。如果因为缺少可用内存不能扩展环境时,函数调用失败并且返回-1。如果发生这种情况,错误变量errno会被设置为ENOMEM。

下面让我们来编写一个程序打印出我们选择的任何环境变量的值。如果我们程序指定了第二个参数,我们还可以设置其值。

试验--getenv与putenv

1 main函数声明之后的几行确保程序environ.c被正确的调用:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *var, *value;
if(argc == 1 || argc > 3) {
fprintf(stderr,”usage: environ var [value]\n”);
exit(1);
}

2 做完这些工作以后,我们使用getenv函数由环境中取得变量的值:

var = argv[1];
value = getenv(var);
if(value)
printf(“Variable %s has value %s\n”, var, value);
else
printf(“Variable %s has no value\n”, var);

3 接下来我们要检测程序调用是否指定了第二个参数。如果指定了第二个参数,我们将变量设置为通过组合成的name=value格式的参数值,然后调用putenv:

if(argc == 3) {
char *string;
value = argv[2];
string = malloc(strlen(var)+strlen(value)+2);
if(!string) {
fprintf(stderr,”out of memory\n”);
exit(1);
}
strcpy(string,var);
strcat(string,”=”);
strcat(string,value);
printf(“Calling putenv with: %s\n”,string);
if(putenv(string) != 0) {
fprintf(stderr,”putenv failed\n”);
free(string);
exit(1);
}

4 最后,我们通过再次调用getenv函数来测试新的变量值:

value = getenv(var);
if(value)
printf(“New value of %s is %s\n”, var, value);
else
printf(“New value of %s is null??\n”, var);
}
exit(0);
}

如果我们运行这个程序,我们可以得到下面的程序输出:

$ ./environ HOME
Variable HOME has value /home/neil
$ ./environ FRED
Variable FRED has no value
$ ./environ FRED hello
Variable FRED has no value
Calling putenv with: FRED=hello
New value of FRED is hello
$ ./environ FRED
Variable FRED has no value

注意,环境只对我们的程序局部可见。我们在程序内部所做的改变并不会反映到程序外部,因为变量值并不会由子进程(我们的程序)传递到父进程(shell)。

使用环境变量

程序通常使用环境变量来改变其工作的方式。用户可以用各种方式改变环境变量,或者是在其默认环境中,修改我们的登陆shell所读取的.profile文件,或者是使用一个shell特定的启动文件(rc),或者是在shell命令行指定变量。例如:

$ ./environ FRED
Variable FRED has no value
$ FRED=hello ./environ FRED
Variable FRED has value hello

shell将初始的变量赋值作为环境变量的临时改变。在我们上面的第二个例子中,程序environ运行在一个变量FRED有值的环境中。

例如,在我们的CD数据库程序的将来版本中,我们会改变一个环境变量CDDB,来指定要使用的数据库。每个用户都可以指定他们自己的默认值或是使用一个shell命令来进行设置:

$ CDDB=mycds; export CDDB
$ cdapp

或者

$ CDDB=mycds cdapp

environ变量

正如我们所看到的,程序环境是由name=value格式的字符串组成的。这个字符串数组是直接通过environ变量使其可以为程序可用的,其声明为:

#include <stdlib.h>
extern char **environ;

试验--environ

这里有一个showenv.c程序,使用environ变量来打印出环境变量:

#include <stdlib.h>
#include <stdio.h>
extern char **environ;
int main()
{
char **env = environ;
while(*env) {
printf(“%s\n”,*env);
env++;
}
exit(0);
}

在当我们在一个Linux系统上运行这个程序时,我们会得到类似于下面的输出,在这里进行大量的简写。这些变量的数量,出现的顺序,及其值依赖于操作系统版本,所使用的命令shell,以及程序运行时的用户设置:

$ ./showenv
HOSTNAME=tilde.provider.com
LOGNAME=neil
MAIL=/var/spool/mail/neil
TERM=console
HOSTTYPE=i386
PATH=/usr/local/bin:/bin:/usr/bin:
HOME=/usr/neil
LS_OPTIONS=—8bit—color=tty -F -T 0
SHELL=/bin/bash
PS1=\h:\w\$
PS2=>
OSTYPE=Linux

工作原理

这个程序在environ变量中遍历来打印出整个环境。
分享到:
评论

相关推荐

    Linux环境变量-在linux系统下.doc

    在Linux操作系统中,环境变量扮演着至关重要的角色,它们决定了系统如何找到并执行命令、配置文件和其他资源。当您在终端尝试运行一个命令时,如果出现"command not found"的错误,很可能是因为相应的可执行文件不在...

    交叉编译环境的建立arm-linux-gcc-4.3.2的安装

    例如,在Linux环境下,您可能需要安装`make`、`tar`等工具。 #### 三、下载arm-linux-gcc-4.3.2 1. **下载arm-linux-gcc-4.3.2源码包** 首先,您需要下载arm-linux-gcc-4.3.2的源码包。可以访问官方或者可信的第...

    aarch64-linux-android-4.9

    1. **环境设置**:确保正确设置了PATH环境变量,使得命令行可以找到工具链的可执行文件。 2. **NDK集成**:此工具链可能与Android Native Development Kit (NDK)相关联,NDK是一套用于在Android平台上开发原生应用和...

    arm-linux-gcc-5.4.0.tar.gz

    总之,`arm-linux-gcc`是进行ARM架构Linux系统交叉编译的重要工具,它的安装和使用涉及到Linux环境变量配置、编译选项选择、库依赖管理等多个方面。熟练掌握这些技能,对于在嵌入式领域开发高效、可靠的应用至关重要...

    arm-none-linux-gnueabi-linux.zip

    2. **配置环境变量**:为了能在命令行中方便地使用这些工具,需要设置环境变量,如`PATH`,指向工具链的bin目录。 3. **编写源代码**:编写或获取适用于目标平台的C/C++源代码。 4. **交叉编译**:使用配置好的...

    arm-linux-gcc-4.4.3安装包及安装教程

    为了让系统能够找到新安装的`arm-linux-gcc`,需要更新环境变量`PATH`。编辑`~/.bashrc`文件,添加以下行: ```bash export PATH=/usr/local/arm/4.4.3/bin:$PATH ``` 然后执行`source ~/.bashrc`使更改生效。 **六...

    arm-linux-gcc-4.5.1-v6-vfp-20101103

    用户在解压后,可以将“opt”目录设置到环境变量PATH中,以便于命令行调用arm-linux-gcc编译器和其他相关工具。 总结一下,"arm-linux-gcc-4.5.1-v6-vfp-20101103"是友善之臂公司为ARM11处理器提供的一个交叉编译...

    arm-linux-gnueabihf-gcc-linaro-7.5.0-x86_64.tar.xz.zip

    3. 设置环境变量:更新`PATH`环境变量,使系统能在命令行中找到新的编译器。 4. 测试编译器:运行`arm-linux-gnueabihf-gcc --version`检查编译器是否成功安装并确认版本。 使用这个交叉编译器,开发者可以为各种...

    aarch64-linux-android-gdb.zip

    1. 安装与配置:首先,你需要将`aarch64-linux-android-gdb`解压并添加到PATH环境变量中,确保可以命令行调用。然后,确保你的Android设备已开启USB调试,并安装了适用于aarch64的NDK,以获取相应的交叉编译工具链。...

    arm-linux-gcc-4.6.4-arm-x86-64交叉编译器安装包(含详细安装教程)

    - **环境变量设置**:更新`PATH`环境变量,使系统能在命令行中找到新安装的交叉编译器。 4. **使用交叉编译器**:一旦安装完成,你可以在你的C/C++项目中通过指定交叉编译器来编译代码,例如,使用`arm-linux-gcc`...

    gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_windows.zip

    在Windows环境下使用这个工具链,开发者可以在本地编写和测试代码,然后将编译好的二进制文件部署到运行ARM Linux的设备上,例如树莓派或其他嵌入式设备。标签中的“gdb”是指GNU Debugger,它是调试这些应用程序的...

    arm-linux-gcc-4.5.1(安装包及教程)

    4. 配置路径:将解压后的编译器目录添加到PATH环境变量中,例如`export PATH=$PATH:/path/to/extracted/gcc/bin`。 5. 验证安装:编译一个小的测试程序,以确认交叉编译器已经正确安装并工作。 整个过程可能会遇到...

    arm-linux-gcc-4.4.3.tar.gz

    步骤四:设置环境变量 为了让系统知道新的交叉编译器的位置,需要在用户或系统的`~/.bashrc`或`/etc/bash.bashrc`文件中添加以下内容: ```bash export CC=/usr/local/arm-linux-gcc-4.4.3/bin/arm-linux-gcc ...

    Qt for arm_Linux环境搭建-Qt5.10.1+AM3352嵌入式平台移植.pdf

    标题表明本文档是关于如何在基于ARM处理器的Linux环境中搭建Qt5.10.1开发环境,并针对AM3352嵌入式平台进行移植的详细说明。描述部分则明确表示,这是作者个人在AM3352平台上实现Qt5.10.1环境搭建的过程记录。 ### ...

    arm-linux-gnueabihf-gdb-8.2_Ubuntu16.04.tar.gz

    2. **启动调试器**:运行arm-linux-gnueabihf-gdb,并加载要调试的二进制文件。 3. **连接目标设备**:使用GDB的target remote命令连接到远程ARM设备,如通过串口、网络或JTAG接口。 4. **设置断点**:在源代码的...

    arm-linux-gcc-4.8.4.tar.gz

    2. 配置编译环境:设置环境变量,如`PATH`、`CC`、`CXX`等,指向交叉编译器的路径。 3. 编译源代码:使用配置好的编译器进行编译,编译命令通常会包含目标架构参数,如`-march=armv7-a`以指定目标处理器类型。 4. ...

    arm-linux-gcc-5.4.0交叉编译工具.rar

    在ARM-Linux环境下,它能够生成针对ARM指令集的二进制代码。 2. **Glibc**:这是GNU C库,提供了许多标准C函数和系统调用接口,是大多数Linux系统的基础。 3. **Binutils**:包括了as(汇编器)、ld(链接器)、...

    x86_64-unknown-linux-gnu-9.2.0.tar.gz

    解压后,用户需要将这些工具添加到他们的PATH环境变量中,以便在命令行中使用。 为了在Windows上成功进行交叉编译,开发者还需要安装一个合适的开发环境,例如MinGW-w64或MSYS2,这些工具集提供了模拟Linux环境所需...

    linux环境下arm-linux-gcc安装

    为了验证 PATH 环境变量是否已经生效,可以执行以下命令:$ echo $PATH,这将显示当前的 PATH 环境变量的值。如果已经将交叉编译器的路径加入 PATH,可以看到交叉编译器的路径在 PATH 环境变量的值中。 至此,交叉...

    arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 交叉编译器.zip

    1. **环境变量设置**:需要设置正确的PATH环境变量,确保系统能找到交叉编译工具链。 2. **配置文件**:通常,交叉编译器会有一个配置文件,用于指定目标架构和工具链路径,比如`config.mk`或`Makefile`。 3. **编译...

Global site tag (gtag.js) - Google Analytics