LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 853|回复: 7

关于子shell

[复制链接]
发表于 2006-3-23 18:33:58 | 显示全部楼层 |阅读模式
把命令用小括号括起来执行时是在子shell中执行
把命令放到脚本中执行时也是在子shell中执行
可是为啥它们的结果不一样?:ask

  1. [root ~]# a=1
  2. [root ~]# (echo $a)
  3. 1
  4. [root ~]# cat test
  5. echo $a
  6. [root ~]# ./test

  7. [root ~]#
复制代码
发表于 2006-3-23 19:42:00 | 显示全部楼层
Post by wplxb
把命令用小括号括起来执行时是在子shell中执行
把命令放到脚本中执行时也是在子shell中执行
可是为啥它们的结果不一样?:ask

  1. [root ~]# a=1
  2. [root ~]# (echo $a)
  3. 1
  4. [root ~]# cat test
  5. echo $a
  6. [root ~]# ./test

  7. [root ~]#
复制代码

因为你没在脚本中给变量赋值
回复 支持 反对

使用道具 举报

发表于 2006-3-23 20:15:25 | 显示全部楼层
一个是subshell,shell调用fork(),没有被导出的变量能被复制,而执行脚本,则可被称为唤出一个新shell,是调用fork()+exec(),没有被导出的变量不能被复制。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-23 21:31:40 | 显示全部楼层
Post by seamonkey
一个是subshell,shell调用fork(),没有被导出的变量能被复制,而执行脚本,则可被称为唤出一个新shell,是调用fork()+exec(),没有被导出的变量不能被复制。

fork()+exec()?
调用其中一个就行了吧?

  1. [root ~]# a=1
  2. [root ~]# echo $a
  3. 1
  4. [root ~]# echo $$
  5. 6027
  6. [root ~]# (echo $a $$)
  7. 1 6027
  8. [root ~]#
复制代码

从上面的结果来看,(...)不是在子shell中执行的
因为当前进程的进程号是一样的
回复 支持 反对

使用道具 举报

发表于 2006-3-23 21:42:27 | 显示全部楼层
不是,请分别执行

echo $$



(ps -l -t pts/1; echo $$)

把pts/1换成你实际的pts

看到了吗,fork出一个子shell了,但在()中$$变量仍保留父shell的PID
回复 支持 反对

使用道具 举报

发表于 2006-3-23 21:43:27 | 显示全部楼层
又重复发帖了。
回复 支持 反对

使用道具 举报

发表于 2006-3-23 22:18:38 | 显示全部楼层
兄弟,这个问题我也问过了,看看我的那个帖子的最后一帖吧,呵呵
我找到了答案,希望对你有帮助

http://www.linuxsir.cn/bbs/showthread.php?t=246719&page=4
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-25 18:46:50 | 显示全部楼层
Post by johnny_jiang
兄弟,这个问题我也问过了,看看我的那个帖子的最后一帖吧,呵呵
我找到了答案,希望对你有帮助

http://www.linuxsir.cn/bbs/showthread.php?t=246719&page=4

谢谢各位,现在明白了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表