程序员的自我修养——Linux下的环境变量原理与shell
概述:
在linux下工作,经常会出现这样的情况:
1)运行某个命令,出现提示-bash:【commandname】:command not found
2)执行某个ELF可执行文件:
xyz@hnode02:~/Downloads/software/bean/workdir>./bean.exe
./bean.exe:error while loading shared libraries: libTreePlayer.so: cannot openshared object file: No such file or directory
当出现cannotfound,nosuch file,cannotopen这类字眼的时候,往往是由于相关的环境变量没有有效设置(也有可能是由于没有安装相关的库或者程序)。本文针对这类问题,主要讲解了环境变量的本质原理,设置方法,以及出现相关问题的解决方法。
1.什么是环境变量
1.1知其所以然
环境变量就是系统或软件设置的一些参数,用户环境变量就是用户登录系统后,都有自已专用的运行环境。当你登入shell环境以后,shell会自动读取/etc/profile ~/.profile ~/.bashrc /.bash_profile等文件,这些文件中往往有相关的环境变量的设置和初始化。环境表(指向实际name=value字符串的指针数组)和环境字符串通常存放在进程存储空间的顶部(栈之上),因此子进程会继承父进程的环境变量。相应的问题就是:为什么我在命令行里面设置了相关的环境变量之后,环境变量生效,但是重新启动一个终端,这个环境变量缺失效了呢?linux下提供了三个系统调用,来修改环境变量:
#include<stdlib.h>
intputenv(char *str);
int setenv(const char *name, const char*value, int rewrite);
int unsetenv(const char *name);
1.2常见的环境变量及其作用
PATH 决定了shell将到哪些目录中寻找命令或程序
HOME 当前用户主目录
HISTSIZE 历史记录数
LOGNAME 当前用户的登录
HOSTNAME 指主机的名称
SHELL 前用户Shell类型
LANGUGE 语言相关的环境变量,多语言可以修改此环境变量
MAIL 当前用户的邮件存放目录
PS1 基本提示符,对于root用户是#,对于普通用户是$
PS2 附属提示符,默认是“>”
LD_LIBRARY_PATH动态链接库的路径
以上这些都是系统环境变量,往往在非用户相关的文件中进行设置,一般都用大写;用户环境变量一般用小写,放在用户相关目录之中。
2.如何设置与查看环境变量
2.1设置一个新的环境变量:
$export HELLO="Hello!"
$echo $HELLO
Hello!
2.2查看环境变量:
显示环境变量HOME
$echo $HOME
/home/redbooks
2.3.使用env命令显示所有的环境变量
$env
HOSTNAME=redbooks.safe.org
PVM_RSH=/usr/bin/rsh
Shell=/bin/bash
TERM=xterm
HISTSIZE=1000
2.4.使用set命令显示所有本地定义的Shell变量
$set
BASH=/bin/bash
BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu")
BASH_VERSION='2.05b.0(1)-release'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=80
DIRSTACK=()
DISPLAY=:0.0
...
2.5.使用unset命令来清除环境变量
set可以设置某个环境变量的值。清除环境变量的值用unset命令。如果未指定值,则该变量值将被设为NULL。示例如下:
$export TEST="Test..." #增加一个环境变量TEST
$env|grep TEST #此命令有输入,证明环境变量TEST已经存在了
TEST=Test...
$unset $TEST #删除环境变量TEST
$env|grep TEST #此命令没有输出,证明环境变量TEST已经存在了
2.6.使用readonly命令设置只读变量
如果使用了readonly命令的话,变量就不可以被修改或清除了。示例如下:
$export TEST="Test..." #增加一个环境变量TEST
$readonly TEST #将环境变量TEST设为只读
$unset TEST #会发现此变量不能被删除
-bash:unset: TEST: cannot unset: readonly variable
$TEST="New" #会发现此也变量不能被修改
-bash:TEST: readonly variable
环境变量的设置位于/etc/profile文件
如果需要增加新的环境变量可以添加下属行
exportpath=$path:/path1:/path2:/pahtN
注意:以上这些命令只有在当前进程与子孙进程中有效,如果想要永久修改,需要修改相关配置文件,然后source这些配置文件,使得它们生效。
3.环境变量相关问题的解决方法
回到概述中提到的两个问题,当出现-bash:【commandname】:command notfound,这种提示的时候,利用find命令找到相关的commandname可执行文件的位置,然后把路径添加到PATH之中即可。对于第二个问题,处理方法类似,不过需要修改的环境变量变成了LD_LIBRARY_PATH.
4.参考
关于配置文件的信息和如何修改PAHT,可参考博客:
bash初探和PATH详解
http://www.zhishiwu.com/os/201304/203701.html