永发信息网

求问关于linux子shell的问题!

答案:3  悬赏:10  手机版
解决时间 2021-01-08 04:26
求问关于linux子shell的问题!
最佳答案
输入bash 启动的是子shell(子进程)。
你可以多次执行bash zsh csh 等等shell 然后运行pstree查看进程树。
环境变量 $SHLVL 用来查看当前shell的层级。
----
#!/bin/bash
echo $$ ; echo $BASH_SUBSHELL;
(echo $$ ; echo $BASH_SUBSHELL;sleep 1 ; pstree|grep bash)
-----
给你一个脚本做测试。
在交互模式下执行这个脚本得到这个:

2459
0
2459
1
| |-zsh---bash---bash-+-grep

其中zsh是我的登录shell,随后的第一个bash是执行shell脚本的主进程,第二个bash是圆括号启动的shell,grep是圆括号里的命令。
层级关系很明确。

其实问题在于bash 在交互模式下,和脚本模式下行为不同。
echo $$ ; echo $BASH_SUBSHELL;
(echo $$ ; echo $BASH_SUBSHELL;bash)
你试试这个,执行后输入echo $$ ,你可以看到子shell的进程号了。
还有环境变量的继承问题,圆括号是会继承父shell的私有变量的,类似于变量的作用域。圆括号在shell 中的目的就是在子进程中执行一个小代码片段:
if ( test -e "$file" );then ;fi
类似于这样,如果没有父进程的私有变量,那就没有意义了。
# bash
启动的子shell就是一个普通的子程序。只继承父shell中的export变量。
全部回答
第一个问题可以理解为其他编程语言的代码块, 代码块里面可以引用外面的变量, 这是很自然的, 既然是shell script的特性, 知道这一点就好了。
echo $$;echo BASH_SUBSHELL;(echo $$;echo BASH_SUBSHELL;)
subshell的$$值继承自父shell, 所以显示的是父shell的pid
要显示subshell的pid可以用$BASHPID
输入bash回车, 这算是subshell么? 同求解答。
子shell可以继承父shell中原有的东西,相当于将父shell中的变量都拷贝了一份过来。

输入bash后,切换到bash环境,这个不是子shell,而是不同的shell,所以PID不同。
因为我有试过,之前的变量无法继承,由此看来不符合子shell的定义。

BASH_SUBSHELL是个环境变量,用于表示进入子shell的层级,既然输入bash后不是进入子shell,当然就层级不变,仍然是0喽。而通过小括号的方式进入子shell,层级加1。
由此可以解释。

PS: 我的操作环境中当前shell不是bash;如果当前shell就是bash,再输入bash,不知是进入子shell还是留在当前shell,这个没试验过。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
雅堂小超做这种社区门口的便利店有什么吸引人
有谁知道济宁实验初中安波校长的手机号?
tcl液晶42寸电视的最新报价是多少
把下面的排列顺序把珠子穿成串。已经穿了81颗
一群人一定有生日相同的,则这群人至少有____
魔兽奶妈高端蓝在哪买
dnf远古幻影9多长时
用俄文怎样写俄语一词
这个人的名字和他的音乐
支付宝密保有什么用
cpld用VHDL编程如何产生时钟?
装修用的桑拿板会不会释放有毒气体?
今年为什么在立冬前上坟
沙市区荆州世纪广场这个地址怎么能查询到,着
以下有关生物遗传与变异的叙述,正确的是A.非
推荐资讯
百度实名认证刷脸为什么试了好几十遍都还不可
用佳明手表的亲们,请问佳明735XT的手表怎样
马戎:如何认识“民族”和“中华民族”
单选题ChuckSwindolloncesaid,“Lifeis10%_
如图(甲)所示的电路中,A1的示数为1.2A,A2
刚谈一个月不到想分手
中国有多少个名字叫赵帅帅的
补写出下列名篇名句中的空缺部分。(任选6题
什么叫感情贴
请问诺基亚E72i如何?官网上卖的黑色,2500两
贾母怎样戏谑王熙凤,说明了什么?
奥飞娱乐股票可能st吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?