求问关于linux子shell的问题!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求问关于linux子shell的问题!相关的知识,希望对你有一定的参考价值。
这里圆括号会产生子shell,那父shell中的变量outervar为什么能在圆括号里的子shell中显示出来,我并没有把它设置成环境变量啊?
达人告知,谢谢!!!
另外,我在终端窗口中输入echo $$,得到PID是4084,输入echo $BASH_SUBSHELL,得到0;然后输入bash回车,再输入echo $$,得到4086,输入echo $BASH_SUBSHELL,还是为0。
输入exit命令后,我采用下面的测试命令:
echo $$;echo BASH_SUBSHELL;(echo $$;echo BASH_SUBSHELL;)
分别输出:
4084
0
4084
1
为什么前面是PID不一样,后面是BASH_SUBSHELL不一样?
到底PID是4086的是子shell,还是BASH_SUBSHELL是1的是子shell?
输入bash后,切换到bash环境,这个不是子shell,而是不同的shell,所以PID不同。
因为我有试过,之前的变量无法继承,由此看来不符合子shell的定义。
BASH_SUBSHELL是个环境变量,用于表示进入子shell的层级,既然输入bash后不是进入子shell,当然就层级不变,仍然是0喽。而通过小括号的方式进入子shell,层级加1。
由此可以解释。
PS: 我的操作环境中当前shell不是bash;如果当前shell就是bash,再输入bash,不知是进入子shell还是留在当前shell,这个没试验过。 参考技术A 输入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变量。本回答被提问者采纳 参考技术B 第一个问题可以理解为其他编程语言的代码块, 代码块里面可以引用外面的变量, 这是很自然的, 既然是shell script的特性, 知道这一点就好了。
echo $$;echo BASH_SUBSHELL;(echo $$;echo BASH_SUBSHELL;)
subshell的$$值继承自父shell, 所以显示的是父shell的pid
要显示subshell的pid可以用$BASHPID
输入bash回车, 这算是subshell么? 同求解答。
关于linux shell执行文件找不到的问题
参考技术A 在linux下有时明明就看到文件在当前目录下,执行权限也没问题,你一执行它就提示no such file or directory!真是坑爹啊。造成这个问题最大的可能性就是该文件引用的动态链接库不存在,比如在64位系统中执行一些32位的老程序,经常会出现找不到对应32库的问题,多见于gcc之类,这在很多新装的64位linux中都会出现(这一点linux不如windows),偏偏提示还不直接点。解决办法当然是补齐所需的库,比如安装386的gcc。
因此下次遇到这种问题可以先用file命令看下当前文件类型及其引用的动态库。
以上是关于求问关于linux子shell的问题!的主要内容,如果未能解决你的问题,请参考以下文章