设为首页 收藏本站
查看: 1095|回复: 0

子shell的$$

[复制链接]

尚未签到

发表于 2015-10-26 00:46:36 | 显示全部楼层 |阅读模式
  
下面是一段代码,我偶然发现有点问题。

  


#!/bin/bash
TestID()
{
echo "in function : $$"
}
TestID &
echo "\$! : $! "
echo "\$\$ : $$ "
sleep 1


[firefox@fire
ShellPractice]$ ./stopped.sh

$! : 15021

$$ : 15020

in function : 15020

  
  
疑问就是在这里,
$!
代表是最后一个
后台程序的ID
$$
当前进程ID
,而
&
出来的应该是一个
子shell
但是它的ID(在子shell里这时候是$$打印出来的)和父shell是“一样”的
。我去论坛上问了下,然后查了些资料。下面是一些简单的介绍:









shell什么情况下会产生子进程



1:&,提交后台作业

  

If a command is terminated by the control operator `&’, the shell executes the command asynchronously in a subshell.



2:管道



Each command in a pipeline is executed in its own subshell



3:括号命令列表



()操作符


Placing a list of commands between parentheses causes a subshell environment to be created



4:执行外部脚本、程序:



When Bash finds such a file while searching the `$PATH’ for a command, it spawns a subshell to execute it.  In other words, executing  filename ARGUMENTS is equivalent to executing bash filename ARGUMENTS


再看看 man
bash
里面对于$的解释


“$”
Expands to the process ID of the shell. In a () subshell, it  expands to the process ID of the current
shell
, not
the sub‐shell
.


那么这里的current
shell
怎么解释呢?字面意思是“当前的shell”。这里有有一篇博客讲子shell,我觉得讲的很好 http://blog.iyunv.com/sosodream/article/details/5683515 。用
./xxx.sh 执行脚本的时候也会生成子shell,原来的shell会有一个 ID,这里假设叫ID1,然后进入脚本,这时脚本里的$$就是current
shell的ID
(由ID1生出的子shell的ID)之后再生出其余的子shell的$$都是current
shell的ID
,也就是由ID1生出来的ID,注意:子shell的ID可不是$$。子shell有它自己的ID。至于怎么获取,一般都用$!来获取。


再来看看下面的脚本


#!/bin/bash
echo "\$\$ outside of subshell = $$"
echo "\$BASH_SUBSHELL outside of subshell = $BASH_SUBSHELL"
echo "\$BASHPID outside of subshell = $BASHPID"
echo "-------------------"
(
echo "\$\$ inside of subshell = $$"
echo "\$BASH_SUBSHELL inside of subshell = $BASH_SUBSHELL"
echo "\$BASHPID inside of subshell = $BASHPID"
)
echo "-------------------"



$BASHPID就是指当前shell。


现在再来看看 man bash 中“$”的解释


[iyunv@fire
ShellPractice]# echo $$

2618


如果你在子shell里面执行这条命令,其实是$$先替换为2618,然后再进行echo,$$一直都指的的是current
shell。




版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-130695-1-1.html 上篇帖子: 关于调用Shell_NotifyIcon操作托盘图标失败的说明 下篇帖子: 希尔排序(Shell Sort)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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