shell变量和子shell的问题请教

白虹李李 2010-07-23 11:14:43
按照书上说,使用()将shell命令扩起来,会产生一个子shell,命令在子shell中执行。
那么一个shell变量,应该在子shell中无效吧?

$>test=true
$>echo $test
true
$>(echo $test;exit 0)
true

$>sh
>echo $test

>

如果显式的启动一个子shell,那么在没有export前,显示test为空,但通过()方式启动,却显示为定义的true。
为什么呢?

使用()方式启动的子shell和显式启动的有什么不同?
请高手指点。
...全文
135 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
白虹李李 2010-07-23
  • 打赏
  • 举报
回复
拜托好心的masmaster大侠认真的看看我的问题,非常感谢。
你的举例和我的问题是完全不一样的。

你的例子中$ ( var=abc;echo $var),是在子shell中赋值,然后返回后证明父shell不认识这个子shell中定义的var。

我的问题不是这个样子的!你说的这个问题我懂。

你说的“root@yeah ~ #父shell定义的变量在子shell里有效”这个说法是错误的。

父shell中定义的变量如果不export,在子shell中是无效的。
看这个例子:
$>test=true
$>sh 启动一个子shell
>echo $test
子shell中不认识test

以上的东西我知道的,但今天看到一个文章,说使用()将命令括起来后,相当于是在一个子shell中执行的命令,也就是说(echo $test),这个“echo $test”不是在本shell中执行的,是在当前shell的一个子shell中执行的。

首先不知道这个说法对不对,如果对的话,为什么这种方式子shell能认识到test呢?


masmaster 2010-07-23
  • 打赏
  • 举报
回复
第一个回来啦第二个没回来就跟(cd path)一样,实际上已经进入path,可是紧跟着就返回啦
白虹李李 2010-07-23
  • 打赏
  • 举报
回复
看了2楼想说明一下,我这里没在子shell中赋值的,也不是证明前面在子shell中赋值,返回后无法使用。
子shell中定义的变量无法直接返回到父shell中我懂的。

我想知道的是两种子shell调用方式有什么区别。
一种方式:
$>(echo $test;exit 0)
true
另一种方式:
$>sh
>echo $test

就是想问问这两种方式(后面一种显式的调用了一个子shell)有什么不同。
前面这种方式(echo $test;exit 0)是否也是隐藏的调用的一个子shell?

steptodream 2010-07-23
  • 打赏
  • 举报
回复
被现象迷惑了 测试方法不对 眼见也不一定为实啊
masmaster 2010-07-23
  • 打赏
  • 举报
回复
用()执行完后, 返回啦


root@yeah ~
$ ( var=abc;echo $var) #在子shell里定义的变量var,显示完后退出啦,子shell里定义的变量
abc #无法返回父shell

root@yeah ~ #返回父shell后
$ echo $var


root@yeah ~ #父shell定义的变量在子shell里有效
$ var=123

root@yeah ~
$ (echo $var)
123
ljc007 2010-07-23
  • 打赏
  • 举报
回复
(echo $test;exit 0)
shell在解释这个命令的时候,已经进行了变量扩展,$test被替换为true
subshell里面执行的其实是echo true;exit 0

19,619

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧