实验
假设有一个脚本script.sh 使用BASH shell
脚本内容#!/bin/bash
name='Tim'
echo 'finished'
这个脚本创建了一个name变量,并给这个变量赋了一个值。等会我们将执行这个命令,执行完成之后我们试着单独echo这个变量,看看会有什么不同的结果。
1.使用./script.sh
2.使用bash script.sh 或者sh script.sh
3.使用. script.sh 注意!.是一个命令,后面要有空格(source命令也称为“点命令”,也就是一个点符号(.),是bash的内部命令。)
分别以三种方式执行这个脚本
1.第一种方式,直接执行权限不足。

我们可以使用chmod命令授予权限,或者使用sudo执行

可以看到,脚本执行结束后,我们在脚本中给变量的值没有拿到。
2.第二种方式在执行之前,我们先收回这个脚本的执行权限并做验证。

然后我们执行

可以看到,脚本可以直接执行。执行结束后,我们在脚本中给变量的值也没有拿到。
3.第三种方式

可以看到,这个脚本可以直接执行,而且可以显示脚本里面的变量值。就好像这个变量被带出来了一样!
总结
综上,我们可以总结出这三种脚本执行方式的区别。
是否需要可执行权限

其实前面出现的变量被带出来的现象,是由这个shell是否在新的进程执行这个脚本决定的。如果在一个新的子进程执行这个脚本,那么在这个子进程执行完这个脚本后,父进程是无法获取子进程的变量的。而如果直接在执行脚本命令的那个进程(没有新创建进程)运行脚本的话,它的变量是一直保留在这个进程里的。
是否以新的进程运行脚本

本文通过实验探讨了Shell脚本的三种执行方式:无权限执行、使用sudo执行和直接执行。在不同方式下,脚本的执行权限、变量的保留情况存在差异。直接执行脚本时,变量值可在进程中保留;而在新进程中执行,则变量无法传递给父进程。
2770

被折叠的 条评论
为什么被折叠?



