程序员的自我修养——Linux下的环境变量原理与shell


程序员的自我修养——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.2cto.com/os/201304/203701.html

相关内容

    暂无相关文章