linux子shell执行方式区别

linux子shell执行方式区别

在shell编程中为了程序尽可能模块化与简洁,除了可以用函数的方式,另一种常用方法就是将不同的功能单独写在不同的脚本文件中,通过脚本间调用。调用方式有以下几种:

  1. . ./xxx.shsource xxx.sh:
  • 相当于函数中的内联函数(inline)的概念,子脚本中的内容会在此处通通展开,此时相当于在一个shell环境中执行所有的脚本内容。(脚本在一个进程中执行)
  • 父子脚本中任何变量都可以共享(注意定义变量的顺序,在使用前声明)
  • 当xxx.sh没有执行权限时,用source。
  1. ./xxx.shbash|sh ./xxx.sh:
  • fork一个子shell来运行子脚本。子脚本执行完,会返回父脚本(两个进程)
  • 继承来自父shell的环境变量(注意必须用export声明,否则无法传递),但是子shell中的环境变量不会返回到父shell中。
  • 当xxx.sh没有执行权限时,用bash 或 sh。
  1. exec ./xxx.sh:
  • 将指定的命令或程序加载到当前进程的内存空间中,并将当前进程的 PID(进程 ID)保持不变,同时替换当前进程的代码、数据和堆栈等信息,从而实现进程的替换。(一个进程)。注意,执行完子脚本,整个进程就结束了。
  • 继承之前的环境变量。
  • 作用有以下几个方面:
    • 节省系统资源:使用 exec 命令可以避免创建新的进程,从而节省系统资源。
    • 优化进程性能:使用 exec 命令可以减少进程间的通信和数据拷贝,从而提高进程的性能。
    • 实现进程的替换:使用 exec 命令可以实现进程的替换,从而在不创建新进程的情况下更新进程的代码和数据。

假设xxx.sh和当前脚本在同一个目录