免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: demoyy
打印 上一主题 下一主题

abs里面关于()和引用变量和替换变量 [复制链接]

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
11 [报告]
发表于 2011-06-14 08:14 |只看该作者
回复 10# demoyy

(echo $$)什么时候改变从父进程里复制的$$了?

论坛徽章:
0
12 [报告]
发表于 2011-06-14 08:48 |只看该作者
回复 11# waker


     我先问下()产生的子shell和./command产生的子shell原理不一样么?

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
13 [报告]
发表于 2011-06-14 09:04 |只看该作者
回复  waker


     我先问下()产生的子shell和./command产生的子shell原理不一样么?
demoyy 发表于 2011-06-14 08:48



    参考那些帖子吧

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
14 [报告]
发表于 2011-06-14 09:06 |只看该作者
什么方法产生子shell都是一样的,但产生后子shell里发生什么就要看子shell的了

论坛徽章:
0
15 [报告]
发表于 2011-06-14 10:28 |只看该作者
回复 14# waker


    通过看了相关的贴,我总结一下我对fork产生子进程和exec运行命令的理解:

用户输入一个命令后或者脚本名字就会发生系统调用,如果该命令是shell的内置命令就会调用当前的shell去解析它,如果是外部命令就会产生一个子shell去exec它.
fork创建子进程的过程,会产生对自己的一个副本,该副本包含了环境变量/权限等等的信息,子进程会继承该副本的相关东西。
exec 是在产生子进程后,运行该命令,子shell就会以他的名字作为参数来来运行该命令.该进程的pid就是该子shell的PID.
  1. osssvr-1:~/test # cat select.sh
  2. #!/bin/bash

  3. PS3='Choose your favorite vegetable: '
  4. echo $$
  5. select vegetable in "beans" "carrots" "potatoes" "onions" "rutabagas"
  6. do
  7. echo
  8.                 echo "Your favorite veggie is $vegetable."
  9.         echo "Yuck!         
  10. done

  11. exit 0
  12. osssvr-1:~/test # ./select.sh   

  13. 1) beans
  14. 2) carrots
  15. 3) potatoes
  16. 4) onions
  17. 5) rutabagas
  18. Choose your favorite vegetable

复制代码
在另外个终端里使用ps来查看,
  1. osssvr-1:~ # ps -ef|grep sele
  2. root     30693  6168  0 10:05 pts/3    00:00:00 /bin/bash ./select.sh
复制代码
在exec的时候是使用/bin/bash这个命令 以./select.sh作为参数来实现的.


那我就以(./select.sh;echo $$)来解释下我自己的理解,望各位指导下我理解是否正确.
在一个终端里运行(./select.sh;echo $$)
  1. osssvr-1:~/test # (./select.sh;echo $$)
  2. 7930
  3. 1) beans
  4. 2) carrots
  5. 3) potatoes
  6. 4) onions
  7. 5) rutabagas
  8. Choose your favorite vegetable: 2

  9. +++++++++++++++++++++++++++++++++++++
  10. +Your favorite veggie is carrots.+
  11. +Yuck!                              +
  12. +++++++++++++++++++++++++++++++++++++
  13. 6168
复制代码
在另外个终端里使用ps查看:
  1. osssvr-1:~ # ps -ef|grep sele
  2. root      7930  7929  0 10:10 pts/3    00:00:00 /bin/bash ./select.sh
  3. osssvr-1:~ # ps -ef|grep 7929
  4. root      7929  6168  0 10:10 pts/3    00:00:00 -bash
  5. root      7930  7929  0 10:10 pts/3    00:00:00 /bin/bash ./select.sh
复制代码
系统调用时()会产生一个sub shell,来处理()里面的命令,在运行./select.sh的时候,也产生了个subshell来运行select.sh脚本.所以./select.sh的$$为7930,这个运行完成后,会调用exit,返回个状态码,唤醒
()产生的sub shell,(./select.sh;echo $$)里面的$$乃是继承了()该sub shell的父shell副本里面的信息.

这样理解对吗?

论坛徽章:
0
16 [报告]
发表于 2011-06-15 13:58 |只看该作者
来人指点下.

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
17 [报告]
发表于 2011-06-15 16:12 |只看该作者
回复 16# demoyy
从抽象层面看,fork就是生产了两个一样内容的进程,不要纠结于父子关系,父子是非常特别的很平等民主自由的,理解这个一切都明了了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP