1 引言
一个进程运行在shell环境中,理解进程运行的环境是十分重要的。环境影响着进程的行为,利用环境提供的便利,可以极大地提高开发效率。本节深入讨论shell中与进程有关的环境问题,包括命令行参数、环境变量和错误号变量等。
2 命令行参数
2.1 简介
当一个新进程执行时,命令行参数和环境变量是两个非常重要的信息。这两个信息都是新进程从产生它的父进程那里获得的,其获得方式也有不同。命令行参数作为main函数的参数被传入到新进程中,而环境变量是作为一种全局变量被新进程所使用的。
对于C语言来说,程序的执行时从main函数开始的。main函数的原型如下:
int main(int argc, char * argv[])
其中,argc是命令行参数的个数,argv是指向参数的字符串指针数组,其中每一个元素都是一个字符串,以‘ ’结尾。在执行一个程序的时候,调用exec()函数的进程会把命令行参数传递给新程序。下面的示例程序就是打印命令行参数:

1 //print command line parameters to stdout 2 #include <stdio.h> 3 4 int main(int argc, char * argv[]) 5 { 6 int i; 7 8 printf("Counts of arguments: %d ", argc); 9 for (i = 0; i < argc; i++) 10 printf("argv[%d]: %s ", i, argv[i]); 11 12 return 0; 13 }
程序运行结果如下:
xiaomanon@xiaomanon-machine:~/Documents/c_code$ gcc main.c -o app xiaomanon@xiaomanon-machine:~/Documents/c_code$ ./app -o yes ok 23 Counts of arguments: 5 argv[0]: ./app argv[1]: -o argv[2]: yes argv[3]: ok argv[4]: 23
2.2 获取文件名
命令行参数数组的第一个元素(即argv[0])是程序的路径名,并不是该程序的文件名。如果希望在程序中使用该程序文件的文件名,则需要做特殊处理。下面实现了一个获取程序文件名的函数,这个函数以一个文件的路径为参数,并且寻找该路径中的最后一个“/”,那么这个“/”右边就是函数需要找的程序文件名。

1 //get program file name 2 #include <stdio.h> 3 #include <string.h> 4 5 char* getFileName(char* fullName) 6 { 7 char *p; 8 //find the last symbol '/' from fullName 9 p = rindex(fullName, '/'); 10 if (p == '