父shell 和 子shell; shell脚本的几种执行方式

Linux执行 脚本 有两种方式,每种方式又有具体不同的执行方法, 主要区别在于是否建立 “子shell 也叫 subshell”。

方式1: source  filename  或者  . filename (点 空格 filename)

  不创建 子shell,在当前 bash 环境下读取filename中的命令,并执行。

        关于 source  . 方法: 如果filename不在当前路径下,或者filename不在执行程序默认的搜索路径下(也就是PATH环境变量), bash可能会提示找不到 filename。

方式2: bash filename  或者 sh filename  或者 ./filename (点 斜杠 filename)  或者  /path1/path2/filename (斜杠 加上 绝对路径)

  创建 子shell, 在当前 bash 环境下 创建一个新的 子shell 来读取filename中的命令,并执行。filename脚本执行完后,子shell 环境随即关闭,然后又回到 父shell 中。

  关于 bash  sh   ./ 方法: 如果filename不在当前路径下,或者filename不在执行程序默认的搜索路径下(也就是PATH环境变量), bash可能会提示找不到 filename。

  关于 bash 和 sh 方法:filename可以不必事先设定可执行权限。 因为是将filename作为参数传递给bash或者sh,是被调用执行。

  关于 ./ 方法: filename必须具备可执行权限,它才可以自己执行。

  额外:子shell 继承 父shell 的变量, 子shell 通过 export 来使用 父shell 的变量。 (跟编程中的作用于有点儿相似)

  

子shell 从 父shell 继承如下内容:

  当前工作目录;

  环境变量;

  标准输入、标准输出、标准错误输出;

  所有已打开的文件标识符;

  忽略的信号;

子shell 不能从 父shell 继承的内容如下:

  除环境变量和 .bashrc文件定义的变量之外的shell变量;

  未被忽略的信号;

下面编写一个脚本(a1.sh) 来玩一下这几种情况:

 

 更多的有关 子shell 继承 父shell 内容,在 子shell 中使用 从 父shell 里继承的内容。 以后有使用案例了,在贴上具体的操作过程。

原文地址:https://www.cnblogs.com/azbane/p/14398795.html