调用脚本的三种方法与区别

时间:2022-09-01 15:42:10

脚本:~/scripts/a.sh,一般调用这个脚本的方法有:

方法一:脚本中加入 #!/bin/bash,命令行输入~/scripts/a.sh ,或者输入 bash ~/scripts/a.sh

这种调用方法是调用fork()函数,创建一个子进程,待脚本执行结束之后再返回父进程。脚本与父进程有不同的进程号(PID)。


方法二:使用source ~/scripts/a.sh 或者 . ~/scripts/a.sh 命令来调用。

这种调用方法是把脚本的内容读到当前环境里执行,不会产生子进程。由于是把脚本读到当前的环境里执行,所以会影响当前进程的变量。例如脚本里定义变量A=1,执行完脚本后,在shell执行echo $A,会返回1,就是由于脚本影响了当前进程的变量。使用方法一不会有此影响。另外,使用这种方法调用脚本不需要取得执行权限,有可读即可。


方法三:exec  ~/scripts/a.sh 

不产生子进程,而是替换掉当前进程。当前进程的进程号是没有变,但是进程号代表的进程就变了。

例:

ps ax可以看到当前shell的pid

15927 pts/2    Ss+    0:00 /bin/bash

使用 exec 调用进程后

15927 pts/2    Ss+    0:00 /bin/bash /home/potato/scripts/sh01.sh

PID 15927 对应的进程不再是bash,而是变成了脚本的进程。当脚本运行完PID 15927就会被关闭(关闭shell)。


-------------------------------------------------------------附加知识点-------------------------------------------------------------------------

小括号里面的命令集合:

( 命令1; 命令2; 命令3; ... ) 
嵌在圆括号里的一列命令在一个子shell里运行。

例如:

在脚本中执行以下命令集合(cd /dir1; do someting...),由于命令集合是在一个子shell里面运行的,不会改变父shell的环境,所以运行完之后当前目录没有被cd /dir1改变,还是在脚本当前目录。