永发信息网

求问关于linux子shell的问题!

答案:3  悬赏:10  手机版
解决时间 2021-01-08 04:26
  • 提问者网友:绫月
  • 2021-01-07 08:55
求问关于linux子shell的问题!
最佳答案
  • 五星知识达人网友:三千妖杀
  • 2021-01-07 09:00
输入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变量。
全部回答
  • 1楼网友:思契十里
  • 2021-01-07 11:26
第一个问题可以理解为其他编程语言的代码块, 代码块里面可以引用外面的变量, 这是很自然的, 既然是shell script的特性, 知道这一点就好了。
echo $$;echo BASH_SUBSHELL;(echo $$;echo BASH_SUBSHELL;)
subshell的$$值继承自父shell, 所以显示的是父shell的pid
要显示subshell的pid可以用$BASHPID
输入bash回车, 这算是subshell么? 同求解答。
  • 2楼网友:酒安江南
  • 2021-01-07 10:38
子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,这个没试验过。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯