本文共 1252 字,大约阅读时间需要 4 分钟。
在shell脚本中调用另一个脚本的方法有三种:fork、exec和source,每种方法的特点不同,适用于不同的场景。以下从实际案例出发,详细说明每种方法的工作原理和适用场景。
fork命令用于新建子进程,调用另一个脚本的方式最为简单直接。只需在shell脚本中执行如./script.sh
,即可启动子进程执行目标脚本。这种方法的优点是新建子进程与父进程独立运行,子进程的环境变量不会影响父进程,但也意味着parent_shell会等待子进程完成后才能继续执行后续命令。
exec命令与fork的主要区别在于,它不会创建新的子进程,而是让子脚本在父进程的环境中执行。这样被调用脚本与父脚本在同一个shell空间中运行,实现了环境变量和信号流的传递。然而,这也意味着一旦exec命令执行,父脚本的后续操作将不再执行,以此注定了exec命令的特性。
source命令在功能上更接近于fork,但它避免了新建子进程,而是在当前shell中直接加载目标脚本的内容。这种方式的优势在于子进程的环境变量、函数和变量等都会被父脚本继承和使用,但同样需要注意parent_shell仍需等待整个调用完成。
为了直观理解这三种方法的区别,我们可以通过以下两个脚本对比它们的执行效果:
####脚本1(t1.sh)
#!/bin/bashecho "PID for 1.sh:$$"export Aecho "1.sh: $A is $A"case $1 in exec) echo "using exec…" exec ./t2.sh ;; source) echo "using source…" source ./t2.sh ;; *) echo "using fork by default…" ./t2.sh ;;esacecho "PID for 1.sh after:$$"echo "1.sh: $A is $A"
####脚本2(t2.sh)
#!/bin/bashecho "PID for 2.sh:$$"echo "2.sh get $A=$A from 1.sh"export Aecho "2.sh: $A is $A"
默认方式(fork)
执行sh t1.sh
会调用t2.sh,新建子进程执行。parent_shell可在子进程完成后继续执行后续操作,子进程的环境变量不会反映到父进程。exec方式
执行sh t1.sh exec
会让t2.sh在同一进程内运行,parent_shell会立即停止执行后续命令。该方式适合需要捎带某些操作的场景。source方式
执行sh t1.sh source
会让t2.sh在同一进程中运行,且环境变量和其他状态会被parent_shell继承。这种方式保留了子进程对父进程环境的修改能力。每种方法有其优劣之处,选择时需结合实际需求。
转载地址:http://qnwfk.baihongyu.com/