|
发表于 2004-5-15 09:07:48
|
显示全部楼层
其实javalee兄说得对啊,为什么兄弟你觉得没有用呢?更何况你没有去尝试过。
在解释前先声明一点,我们这个版区,顾名思义,讨论的大前提是shell,而不是程序设计。
通常情况下,在标准文件描述器中与进程相关的终端就是该进程及其会话的控制终端。众所周知,每个终端上运行一个shell,控制终端也不例外(比如说,你在xterm里运行一个命令,shell产生一个进程来执行该命令,对该进程而言,这个shell就是它的控制终端)。控制终端的shell不但控制着其管辖进程的文件描述符,而且也是信号收集器,更是环境配置者,当然就包括环境变量的设置了。
环境变量只能由父进程继承给子进程。这是值得注意的,我们经常会犯这样的错误,比如,在shell里运行export命令声明一个环境变量,这对于其管辖进程是有效的,但对于另一个shell组长而言则不可见(打开一个xterm创建一个新组长);又比如说,在一个子进程如脚本里export一个环境变量,但对于组长乃至其他管辖进程又不可见。这就是兄弟的设置环境变量的错误根源。
至于bash的配置文件究竟是如何工作的。我在此再说一遍。
1. /etc/profile是交互式登录shell的全局配置文件,~/.bash_profile是相应的个人配置文件,后者的运行优先级高于前者
2. /etc/bashrc是交互式非登录shell的全局配置文件,~/.bashrc是相应的个人配置文件,后者的优先级别高于前者
系统启动后,打开一个tty,在其上产生一个登录进程login,用户登录后就会为其运行一个shell,这时候先执行/etc/profile,然后执行~/.bash_profile;在其后,用户自行创建一个交互式shell,注意,和profile不同,如果存在~/.bashrc,则执行它而不执行/etc/bashrc。
另外,有一点例外,如果使用kdm等x显示管理器来进行登录,则可能不会执行/etc/profile,比如debian,这时候要自己在相应的x配置文件里调用/etc/profile。
好了,回到你的问题上。
1.环境变量的设置与进程通信以及信息传递无关,无论设置的方式如何多样,都是由shell即控制终端所管理
2.要在x下设置环境变量,如果是debian,则在/etc/environment文件进行设置,如果是其它发行版本,如redhat,则在/etc/profile以及~/.bashrc里加入即可
3.正因为环境变量是上传下的,所以只要我们在/etc/profile等配置文件里设置好了,也就是说,在最老的控制终端上设置好了,那么以后它产生的进程乃至控制终端都可以继承环境变量了。注意,不可能改变父进程的环境变量,只能在某子进程里屏蔽而已。当然,x另当别论,请看上面的论述。
ps:
1.既然我们玩linux,就应该遵守linux的游戏规则
2.在unix的c语言里,用标准库函数char *getenv(const char *name)来获取环境变量;
当附加环境变量运行一个程序时,即ENVNAME=VALUE command的形式。
实际的程序中一般用exec家族函数来执行命令,如execve("./myscript",argv,envp) |
|