`
xitong
  • 浏览: 6195703 次
文章分类
社区版块
存档分类
最新评论

子shell的$$

 
阅读更多

下面是一段代码,我偶然发现有点问题。

#!/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脚本中获取进程ID的方法

    当我在执行shell脚本时,它会启动一个叫子shell的进程。作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为“批处理进程”)。 在某些情况下,你也许想要知道运行中的子shell的PID。这个PID...

    LinuxShell脚本学习基础视频

    【】11a00d99b60c4e2eba3440b8aa3a6bdd【】linux_shell脚本编程_01认识shell,如何编写shell脚本和执行【】linux_shell脚本编程_02vivim简单的常用操作【】linux_shell脚本编程_03变量和数值运算,父shell和子shell的...

    lectrote, 在电子 shell 中,如果是解释程序.zip

    lectrote, 在电子 shell 中,如果是解释程序 Lectrote : 电子中的中频解释程序( )版本 1.2.5由 Andrew Plotkin erkyrath@eblong.com 创建。下载最新的Lectrote应用程序。如果使用 Chromium 浏览器作为

    ANSYS子模型应用实例SHELL-Solid

    利用ANSYS进行子模型分析,实例中采用命令流的方式讲解了进行子模型进行分析的方法

    shell 编程指南pdf

    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 ...

    Linux Shell编程从初学到精通 第2版

    第1章 Shell脚本编程概述 1 ...第12章 子Shell与进程处理 288 第13章 函数 314 第14章 别名、列表及数组 335 第15章 一些混杂的主题 359 第16章 Shell脚本调试技术 403 第17章 bash Shell编程范例 420

    lua-resty-shell, 用于OpenResty应用服务器的微型子进程/shell 库.zip

    lua-resty-shell, 用于OpenResty应用服务器的微型子进程/shell 库 简介当你需要执行子进程( 或者 shell 命令) 时,这个小型库是用于与OpenResty应用程序一起使用的。 除了 non completely完全不阻塞外,即使是完全不...

    Linux Shell 编程实战.zip

    Shell是Linux的外壳,是Linux的用户界面, Shell为用户提供了输入命令和参数并可得到命令执行结果的环境。用户对Shell理解越深刻, Shell对用户工作的支持就越有力。可以说,熟练掌握Shell编程,能大大...子程序

    shell编程学习笔记

    若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量:『export PATH』 9.通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ; ...

    shell浅谈之九子shell与进程处理.docx

    Linux是一种用户控制的多作业操作系统,系统允许多个系统用户同时提交作业,而一个系统用户又可能用多个shell登录,每个系统用户可以用一个shell提交多个作业。了解Bash Shell在多作业管理和进程处理方面的命名和...

    命令解释器—模仿Shell有相应的电子文档和源代码

    由于课题是要模拟Shell功能,Shell命令中有大部分是文件的作,有关文件夹的创建与删除,文件的操作,当前目录等一系列问题都是有待解决的;并且由于本身做的就是一个Shell那么就不能再使用系统中原有的Shell 命令,...

    shell编程 从入门到精通百度网盘下载地址.

    包括概述、linux文件系统、正则表达式、sed命令和awk编程、文件的排序、合并和分割、变量和引用、操作符、循环与结构化命令、变量的该机用法、I/O重定向、linux/unix shell类型与区别、子shell进程处理、函数、别名...

    Linux 简单的SHELL 程序实现!

    属原创! 简单的shell 实现 cd ls echo environ jobs 批处理 后台并发

    跟老男孩学Linux运维:Shell编程实战

    《跟老男孩学Linux运维:Shell编程实战》第五部分为第17章~第20章,着重讲解Linux信号及trap命令的企业应用实践、Expect自动化交互式程序的应用实践、贯穿全书技术的面试题和企业实战案例,以及子Shell知识。

    LINUX与UNIX 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编程.md

    简单shell程序

    简单shell程序,实现copy,type,创建子进程,执行外部命令的功能

    尚官Linux Shell 编程实战

    Shell是Linux的外壳,是Linux的用户界面, Shell为用户提供了输入命令和参数并可得到命令执行结果的环境。用户对Shell理解越深刻, Shell对用户工作的支持就越有力。可以说,熟练掌握Shell编程,能大大...子程序

    跟老男孩学Linux运维:Shell编程实战 part3

    本书可分为五大部分:第一部分为第1章~第4章,此...第五部分为第17章~第20章,着重讲解Linux信号及trap命令的企业应用实践、Expect自动化交互式程序的应用实践、贯穿全书技术的面试题和企业实战案例,以及子Shell知识。

Global site tag (gtag.js) - Google Analytics