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 里继承的内容。 以后有使用案例了,在贴上具体的操作过程。