程序员的自我修养——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

    当出现cannotfoundnosuch filecannotopen这类字眼的时候,往往是由于相关的环境变量没有有效设置(也有可能是由于没有安装相关的库或者程序)。本文针对这类问题,主要讲解了环境变量的本质原理,设置方法,以及出现相关问题的解决方法。


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详解


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值