问题的引出

项目中脚本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解释运行脚本!

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

  1. 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter6-Linux 环境变量

    六.Linux 环境变量 bash shell 使用环境变量来存储 shell 会话和工作环境的相关信息(这也是被称作环境变量的原因).环境变量允许在内存中存储数据, 以便 shell 中运行的程序或 ...

  2. Linux——孤儿进程|进程的优先级 用top命令去修改优先级 其他概念 环境变量 PATH 获取环境变量

    目录 孤儿进程 进程的优先级 用top命令去修改优先级 其他概念 环境变量 PATH 获取环境变量 习题 孤儿进程 父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢? 父进程先退出,子 ...

  3. bashrc文件中环境变量配置错误,导致linux命令无法正常使用的解决方案

    分析原因 bashrc文件中环境变量配置错误,导致linux无法正常使用. 其实解决问题的方法很简单:把你在bashrc文件中写错的东西注释掉或者改写正确即可. 可是此时图形界面登陆不了,vim用不了 ...

  4. Linux中环境变量文件及配置

    一.环境变量文件介绍 转自:http://www.cnblogs.com/mengyan/archive/2012/09/04/2669894.html Linux中环境变量包括系统级和用户级,系统级 ...

  5. Linux中环境变量的设置——setenv/export

    Linux中环境变量的设置--setenv/export 环境变量 境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统 ...

  6. Linux中环境变量

    目录 1.什么是环境变量 2.常见的一些环境变量: 2.1PATH: 2.2HOME: 2.3shell: 3.查看当前的环境变量 3.1env: 3.2echo $ [环境变量名称] 3.3在操作系 ...

  7. linux中d4B什么意思,Linux中环境变量文件及配置+++

    Linux中环境变量文件及配置 一.环境变量文件介绍 转自:://http://www.doczj.com/doc/63e2b4bd482fb4daa48d4b53.html/cscmaker/art ...

  8. 《Linux就该这么学》培训笔记_ch03_管道符、重定向与环境变量

    <Linux就该这么学>培训笔记_ch03_管道符.重定向与环境变量 <Linux就该这么学>培训笔记_ch03_管道符.重定向与环境变量 文章最后会post上书本的笔记照片. ...

  9. nodejs 获取系统环境变量_Node.js中环境变量process.env的一些事详解

    前言 最近这两天在和运维GG搞部署项目的事儿.碰到一个问题就是,咱们的dev,uat,product环境的问题. 因为是前后端分离,所以在开发和部署的过程中会有对后端接口的域名的切换问题.折腾了一下午 ...

最新文章

  1. phpexecl保存mysql_【PHP】将数据库表保存为Excel(PHPExcel)
  2. mysql 登录_Spring boot redis +mysql实现登录功能
  3. C语言ODBC方式连接DM数据库
  4. Package ‘oniguruma’, required by ‘virtual:world’, not found
  5. class.sitemap.php
  6. 域服务器账号权限,域中文件服务器权限设置
  7. Python+Selenium+Edge浏览器安装与简单运行(1/2)
  8. 专家提醒 IE下JS编程中需注意内存释放问题
  9. Java可以加速播放的播放器,基于live555的rtsp播放器之十二:使用soundtouch加速音频播放...
  10. 第2关:比较、掩码和布尔逻辑
  11. 红米手机4A怎么样刷入开发版获得ROOT权限
  12. Android中View绘制各种状态的背景图片原理深入分析以及StateListDrawable使用
  13. Matplotlib绘制图片——膨胀算法
  14. 安恒6月赛部分做题记录
  15. dev-tool安装方法(手动安装版)
  16. 别克英朗18T用车感受(一)
  17. mysql 进制转换函数_SQL Server 进制转换函数
  18. springcloud:什么是分布式微服务,如何学习微服务(一)
  19. 计算机病毒论文百度百科,计算机病毒解析与防范论文.doc
  20. 十四款原创纯DOS(硬盘,软盘,光盘,闪盘,虚拟盘 通用)新版杀毒软件

热门文章

  1. Oracle GoldenGate 12c 新特性
  2. 各种囧然不同流行的编程风格
  3. [ app.json 文件内容错误] app.json: [“usingComponents“][“van-button“]: “@vant/weapp/button/index“ 未找到
  4. 每个前端工程师都应该去了解的前端面试题总结(一)
  5. CSS强制英文、中文换行与不换行
  6. OpenCV实战1——图像矫正技术
  7. 7-3 输出最大公约数 (10 分)
  8. linux查看历史的所有命令,linux查看历史命令history
  9. PAT乙级 1061 判断题
  10. 在函数中的局部程序(像是比局部变量还局部的部分)