为了技术,我不会停下学习的脚步,我相信我还能走二十年。
分类:
2012-07-06 20:27:05
原文地址:关于shell临时改变环境变量的认识 作者:g_programming
关于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执行时的环境变量;