shell中的几种少见的变量继承(传递)方式

2 篇文章 0 订阅

shell中的几种少见的变量继承(传递)方式

背景

众所周知,父shell中的临时变量是不能被子shell继承的。要想继承只能在父shell中将变量使用export导出,变为环境变量。
但是这几天研究一些著名开源项目中的configure脚本,发现了一些不同寻常的方式可以让子shell继承父shell中的变量而不用export导出。

使用小括号传递变量

AA=aa
(echo ${AA})

按理说小括号里的命令是在子shell中执行的,子shell中变量AA应该是空,但是这种情况下确实会输出aa

结论

小括号中的命令在执行时可以继承括号外层的临时变量

总结

这种用法在其他的博客中基本都是在讲几种括号时随口提一句,有些博客甚至都没指明这一点,只是在代码里出现,不知道的人甚至以为代码写错了。
没有一篇博客专门说明这种用法。只有chinaunix论坛上的一篇帖子对此有讨论,但也没有什么结论。
所以这里我也只是指出这种特殊的用法,对于原理不做讨论。

将变量在启动时传入脚本中

test.sh

echo ${AA}

shell:

AA=aa ./test.sh

执行脚本的父shell中的临时变量按理说是不能被脚本继承的,在脚本中变量AA应该是空,但是这种情况下确实会输出aa

结论

将定义变量的语句放在启动脚本的前面 就可以将定义的变量传入脚本中,注意一定要将定义变量的语句和启动脚本的命令写在同一行,分开无法生效

总结

这个用法是在x264的configure脚本中学到的。

x264的configure脚本中的CC变量在脚本的开头就直接进行判断如果是空就赋值为gcc,然后再也不会修改。那么怎么支持其他的编译器的呢?后来在一篇x264编译的文章中看到了这种用法,但是作者也没有对此特别说明。

这种用法非常的隐蔽,目前为止完全没有找到任何一篇文章(包括英文的)对这种用法有任何说明。我在这篇文章中特此说明,也算填补空白了。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值