下面是一段代码,我偶然发现有点问题。
#!/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 shellexecutes 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 subshellenvironment to be created
4:执行外部脚本、程序:
When Bash finds such a file whilesearching the `$PATH’ for a command, it spawns a subshell to executeit.In other words, executing filename ARGUMENTSis equivalent to executingbash filename ARGUMENTS
再看看man
bash里面对于$的解释
“$”
Expands to the process ID of the shell. In a () subshell, it expands to the process ID of thecurrent
shell,not
the sub‐shell.
那么这里的current
shell怎么解释呢?字面意思是“当前的shell”。这里有有一篇博客讲子shell,我觉得讲的很好http://blog.csdn.net/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 中“$”的解释
[root@fire
ShellPractice]# echo $$
2618
如果你在子shell里面执行这条命令,其实是$$先替换为2618,然后再进行echo,$$一直都指的的是current
shell。
分享到:
相关推荐
本文详细论述了,并且通过实例,描述了在shell脚本当中,创建子shell的情况。
当我在执行shell脚本时,它会启动一个叫子shell的进程。作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为“批处理进程”)。 在某些情况下,你也许想要知道运行中的子shell的PID。这个PID...
【】11a00d99b60c4e2eba3440b8aa3a6bdd【】linux_shell脚本编程_01认识shell,如何编写shell脚本和执行【】linux_shell脚本编程_02vivim简单的常用操作【】linux_shell脚本编程_03变量和数值运算,父shell和子shell的...
lectrote, 在电子 shell 中,如果是解释程序 Lectrote : 电子中的中频解释程序( )版本 1.2.5由 Andrew Plotkin erkyrath@eblong.com 创建。下载最新的Lectrote应用程序。如果使用 Chromium 浏览器作为
利用ANSYS进行子模型分析,实例中采用命令流的方式讲解了进行子模型进行分析的方法
14.3.7 将变量导出到子进程 140 14.4 位置变量参数 141 14.4.1 在脚本中使用位置参数 142 14.4.2 向系统命令传递参数 142 14.4.3 特定变量参数 143 14.4.4 最后的退出状态 144 14.5 小结 145 第15章 引号 146 15.1 ...
第1章 Shell脚本编程概述 1 ...第12章 子Shell与进程处理 288 第13章 函数 314 第14章 别名、列表及数组 335 第15章 一些混杂的主题 359 第16章 Shell脚本调试技术 403 第17章 bash Shell编程范例 420
lua-resty-shell, 用于OpenResty应用服务器的微型子进程/shell 库 简介当你需要执行子进程( 或者 shell 命令) 时,这个小型库是用于与OpenResty应用程序一起使用的。 除了 non completely完全不阻塞外,即使是完全不...
Shell是Linux的外壳,是Linux的用户界面, Shell为用户提供了输入命令和参数并可得到命令执行结果的环境。用户对Shell理解越深刻, Shell对用户工作的支持就越有力。可以说,熟练掌握Shell编程,能大大...子程序
若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量:『export PATH』 9.通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ; ...
Linux是一种用户控制的多作业操作系统,系统允许多个系统用户同时提交作业,而一个系统用户又可能用多个shell登录,每个系统用户可以用一个shell提交多个作业。了解Bash Shell在多作业管理和进程处理方面的命名和...
由于课题是要模拟Shell功能,Shell命令中有大部分是文件的作,有关文件夹的创建与删除,文件的操作,当前目录等一系列问题都是有待解决的;并且由于本身做的就是一个Shell那么就不能再使用系统中原有的Shell 命令,...
包括概述、linux文件系统、正则表达式、sed命令和awk编程、文件的排序、合并和分割、变量和引用、操作符、循环与结构化命令、变量的该机用法、I/O重定向、linux/unix shell类型与区别、子shell进程处理、函数、别名...
属原创! 简单的shell 实现 cd ls echo environ jobs 批处理 后台并发
《跟老男孩学Linux运维:Shell编程实战》第五部分为第17章~第20章,着重讲解Linux信号及trap命令的企业应用实践、Expect自动化交互式程序的应用实践、贯穿全书技术的面试题和企业实战案例,以及子Shell知识。
14.3.7 将变量导出到子进程 140 14.4 位置变量参数 141 14.4.1 在脚本中使用位置参数 142 14.4.2 向系统命令传递参数 142 14.4.3 特定变量参数 143 14.4.4 最后的退出状态 144 14.5 小结 145 第15章 引号 146 15.1 ...
shell编程.md
简单shell程序,实现copy,type,创建子进程,执行外部命令的功能
Shell是Linux的外壳,是Linux的用户界面, Shell为用户提供了输入命令和参数并可得到命令执行结果的环境。用户对Shell理解越深刻, Shell对用户工作的支持就越有力。可以说,熟练掌握Shell编程,能大大...子程序
本书可分为五大部分:第一部分为第1章~第4章,此...第五部分为第17章~第20章,着重讲解Linux信号及trap命令的企业应用实践、Expect自动化交互式程序的应用实践、贯穿全书技术的面试题和企业实战案例,以及子Shell知识。