您的位置:首页 > 运维架构 > Shell

Linux下的环境变量原理与shell

2014-05-11 20:12 232 查看
概述:

在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,可参考博客:linux下的系统和软件配置方法简介
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: