Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1088286
  • 博文数量: 646
  • 博客积分: 288
  • 博客等级: 二等列兵
  • 技术积分: 5375
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-08 14:33
个人简介

为了技术,我不会停下学习的脚步,我相信我还能走二十年。

文章分类

全部博文(646)

文章存档

2014年(8)

2013年(134)

2012年(504)

分类:

2012-07-06 20:27:05

关于shell临时改变环境变量的认识

 

在学习shell脚本指南的时候,在125页写到关于改变环境变量用法中,使用如下命令临时改变环境变量:

PATH=/usr/bin:/bin awk '...' file1

这个PATH值的改变仅仅针对于单个awk命令的执行而言,而接下来的命令使用的PATH值都是shell环境中的当前值,意味着这条shell指令仅仅只是临时改变了环境变量而言,但是细想了一下,想知道awk命令执行中,环境变量是使用的那个临时的PATH值吗?? 我的第一反应就是使用了他的临时值,所以我使用了下面的shell指令进行验证:

PATH=/bin:/usr/bin  awk -v var=$PATH 'BEGIN{print "awk1:"var}'

测试的结果出乎我的意料:

awk1:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

我就猜想为啥临时改变环境变量不影响awk命令执行时候的环境变量呢?? 我估计是由于临时环境变量影响了查找给定命令awk的后,shell就恢复其原来的环境变量,然后由于awk命令的执行产生子shell,命令继承父shell环境变量,所以没有改变。

 

在测试了PATH=/bin:/usr/bin后面加命令执行的结果后,我就想如果不加命令,那么铁定就会改变shell的环境变量了,因为这条shell指令重新设置了PATH的值,看到env -i命令也可以临时改变环境变量的值的时候我也猜想是不是env -i命令也跟上面的一样呢?经过测试发现,不管env -i命令后面加不加单条其他shell指令都不会影响shell以后的环境变量,

 

测试脚本如下:

#! /bin/bash

#set -x

printf "PATH: $PATH\n"

PATH=/bin:/usr/bin  awk -v var=$PATH 'BEGIN{print "awk1:"var}'

PATH=/bin:/usr/bin:/usr/local/bin

printf "PATH: $PATH\n"

 

env -i PATH= ls /

printf "PATH: $PATH\n"

env -i PATH=/bin:/usr/bin awk -v var=$PATH 'BEGIN{print "awk2:"var}'

printf "PATH: $PATH\n"

env -i PATH=/bin

printf "PATH: $PATH\n"

 

测试结果:

PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

awk1:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

PATH: /bin:/usr/bin:/usr/local/bin

env: ls: #由于设置的PATH路径为空,所以找不到ls命令

没有那个文件或目录

PATH: /bin:/usr/bin:/usr/local/bin #env –i后加awk命令未改变shell环境变量

awk2:/bin:/usr/bin:/usr/local/bin

PATH: /bin:/usr/bin:/usr/local/bin#env –i后未加任何命令未改变shell环境变量

PATH=/bin

PATH: /bin:/usr/bin:/usr/local/bin

 

结论:

(1)      PATH=/usr/bin:/bin command 临时改变环境变量,但并不改变command执行时的环境变量;

(2)      PATH=/usr/bin:/bin 改变shell环境变量,此为一条赋值指令;

(3)      env -i PATH=/bin command临时改变环境变量,但并不改变command执行时的环境变量;

(4)      env -i PATH=/bin临时改变环境变量,并不改变以后shell执行时的环境变量;

 

阅读(340) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~