linux 变量的继承,solaris移植到linux的大坑:bash和sh中环境变量继承的差异

问题的引出

项目中脚本A 、B,A调用B,

其中A中所有命令均使用绝对路径,B中直接使用

在solaris上工作正常,移植到linux中报错:

/syscom/lm/linux//backupgen: line 60: mkdir: command not found

/syscom/lm/linux//backupgen: line 61: cd: /syscom//tmp/syscom_dir: No such file or directory

/syscom/lm/linux//backupgen: line 62: mkdir: command not found

没有找到cd、mkidr等命令,很明显是PATH变量设置错误了。

很快定位到问题点,在A中设置了非法的PATH值:

PATH=/syscom/tmp

bash中环境变量的继承关系

在一般的理解中,bash和sh完全一样,原因就在于sh逐渐被废弃。

[jud@syscom]$ls -l /bin/sh

lrwxrwxrwx. 1 root root 4 Mar 18 2014 /bin/sh -> bash

在linux中sh是bash的链接,已经没有sh了。

测试bash中变量继承关系:

[jud@~]$TEST=a #设置自定义变量TEST值为a

[jud@~]$echo $TEST

a

[jud@~]$bash #进入子bash

[jud@~]$echo $TEST #打印TEST变量,值为空

[jud@~]$ echo $PATH #打印PATH变量的值

/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/syscom/bin:/syscom/lm/linux:.

[jud@~]$ PATH=/tmp #设定PATH的值

[jud@~]$ echo $PATH

/tmp

[jud@~]$ bash #进入子bash,无法使用bash命令

-bash: bash: command not found

[jud@~]$ /bin/bash #必须用绝对路径才可以

bash: id: command not found

bash: id: command not found

[jud@~]$ echo $PATH #子bash继承了父bash的环境变量

/tmp

如果通过export命令将自定义变量 TEST变更为 环境变量:

[syscom@sysbase0-0 ~]$ export TEST=a

[syscom@sysbase0-0 ~]$ bash

[syscom@sysbase0-0 ~]$ echo $TEST

a

从以上的举例中可以看出来,bash中自定义变量是不能继承的,环境变量是继承的。

sh中环境变量继承关系

在古老的solaris上仍然使用着sh

> ls -l /sbin/sh

-r-xr-xr-x 1 root root 95492 9月 22日 2010年 /sbin/sh

> ls -l /usr/bin/bash

-r-xr-xr-x 1 root bin 795204 12月 24日 21:58 /usr/bin/bash

可见在solaris上bash与sh是两个不同的shell!

测试sh中的变量继承关系:

> sh

$ TEST=a #设置自定义变量TEST值为a

$ echo $TEST

a

$ sh #进入子sh

$ echo $TEST #打印TEST变量,值为空

$ echo $PATH #打印PATH变量的值

/usr/local/PGRUV05L23R1000_sol:.:/export/home/fnstli:/export/home/fnstli/bin:/usr/sbin:/usr/bin:/opt/SUNWspro/bin:/usr/ucb:/usr/etc:/usr/local/bin:/usr/ccs/bin:/usr/include:/etc/opt/FSUNiconv/bin:/usr/openwin/bin:/usr/X/bin:/usr/bin/X11:/usr/xwin/bin:/syscom-E11/lm/solaris:/syscom/tool:/syscom-E11/bin:/usr/sfw/bin:/opt/netbeans-5.5.1/bin:/usr/jdk/jdk1.5.0_16/bin:/usr/sfw/bin

$ PATH=/tmp #设定PATH的值

$ echo $PATH

/tmp

$ /sbin/sh #进入子sh

$ echo $PATH #子sh中的$PATH没有继承父sh的值!

/usr/local/PGRUV05L23R1000_sol:.:/export/home/fnstli:/export/home/fnstli/bin:/usr/sbin:/usr/bin:/opt/SUNWspro/bin:/usr/ucb:/usr/etc:/usr/local/bin:/usr/ccs/bin:/usr/include:/etc/opt/FSUNiconv/bin:/usr/openwin/bin:/usr/X/bin:/usr/bin/X11:/usr/xwin/bin:/syscom-E11/lm/solaris:/syscom/tool:/syscom-E11/bin:/usr/sfw/bin:/opt/netbeans-5.5.1/bin:/usr/jdk/jdk1.5.0_16/bin:/usr/sfw/bin

从以上的举例中可以看出来,sh中自定义变量是不能继承的,环境变量同样不能被继承!

总结

环境变量在sh和bash的继承规则并不相同。在solaris的脚本向linux平台移植时,需要特别注意solaris大多使用sh解释运行脚本!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值