当前位置:网站首页>Shell脚本执行的三种方式
Shell脚本执行的三种方式
2022-08-04 05:31:00 【Louzen】
参考:https://blog.csdn.net/timchen525/article/details/76407735
- bash script-name 或 sh script-name
- path/script-name 或 ./script-name
- source script-name 或 . script-name
(1)bash script-name 或 sh script-name
这是当脚本文件本身没有可执行权限(即文件权限属性x位为-号)时常使用的方法(不管脚本有无可执行权限都可以通过这种方式运行),或者脚本文件开头没有指定解释器时需要使用的方法(这种脚本运行方式的bash或sh意思就是给脚本指定了命令解释程序,而脚本中第一行的#!/bin/bash或#!/bin/sh与此作用相同)。推荐使用这种方法。
(2)path/script-name 或 ./script-name
执行条件有二:脚本文件被赋予了执行权限;脚本文件第一行指定了命令解释程序(一般为#!/bin/bash)
注意:在生产环境中,运维人员由于忘记为该脚本设置可执行权限,然后直接使用,导致出错。因此,推荐第一种 bashscript-name。
(3)source script-name 或 . script-name
source或者 “.” 命令的功能是:读入脚本并执行脚本,即在当前Shell中执行source或 “.” 加载并执行的相关脚本文件的命令及语句,而不是产生一个子Shell来执行文件中的命令。
注意:这是和其他集中执行shell方式的最大不同。
举个栗子:
新建一个文件test.sh,不给它赋予任何执行权限
test.sh 内容如下
name="Louzen"
echo "set name to Louzen"
这个脚本文件与常见的shell不同之处在于,这里的文件没有赋予可执行权限以及在文件内容中的首行中没有添加#!/bin/bash。
我们现在用上述介绍的几种方式来测试下效果。
第一种:bash test.sh
可以执行脚本内容,但是脚本中设置的name变量却输出为空
name值是空的,是因为bash script-name 是产生了一个子进程shell,而我们当前的操作还在父进程shell中,因此得不到name变量。
第二种:./test.sh
不能执行脚本内容,赋予权限后可以执行,但是name变量还是输出为空
name为空,原因与第一种相同
第三种:source test.sh
test.sh 没有执行权限的情况下可以执行,并且成功输出name的值
可以成功的输出变量的值。这是因为source script-name和. script-name是将script-name中的内容直接加载到当前的shell,因此能够输出当前变量的值。
补充知识点:
一个规范的Shell脚本在第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容在Linux bash的编程一般为:
#!/bin/bash 或 #!/bin/sh
注意:
(1)在Shell中如果一行如果以 “#!” 开头,就是在指明命令解释程序(解释器),如果第一行仅以 “#” 开头,就是一个普通的注释,除第一行之外的其他行,只要第一个字符是 “#” 那就都是注释。
(2)sh为bash的软链接,大多数情况下,脚本的开头使用“#!/bin/bash”和“#!/bin/sh”是没有区别的,但更规范的写法是在脚本的开头使用“#!/bin/bash”。二者的区别是有没有开启posix模式,具体参考:https://blog.csdn.net/wangxin6722513/article/details/44922695
边栏推荐
- 2020-03-27
- 强化学习中,Q-Learning与Sarsa的差别有多大?
- YOLOV4流程图(方便理解)
- Completely remove MySQL tutorial
- MNIST手写数字识别 —— 从二分类到十分类
- Machine Learning - Processing of Text Labels for Classification Problems (Feature Engineering)
- Code to celebrate the Dragon Boat Festival - Zongzi, your heart
- No matching function for call to 'RCTBridgeModuleNameForClass'
- The usefulness of bind() system call
- Pytest common plug-in
猜你喜欢
随机推荐
理想的生活
Detailed steps to install MySQL
Copy Siege Lions "sticky" to AI couplets
The Unity of ML - agents interpret parameter Settings
详解近端策略优化
[Copy Siege Lion Log] Flying Pulp Academy Intensive Learning 7-Day Punch Camp-Study Notes
tensorRT教程——tensor RT OP理解(实现自定义层,搭建网络)
LeetCode_Nov_2nd_Week
基于BiGRU和GAN的数据生成方法
No matching function for call to 'RCTBridgeModuleNameForClass'
arm learning-1-development board
Postgresql snapshot
Deep learning, "grain and grass" first--On the way to obtain data sets
深度学习理论——过拟合、欠拟合、正则化、优化器
[CV-Learning] Linear Classifier (SVM Basics)
target has libraries with conflicting names: libcrypto.a and libssl.a.
[开发杂项][调试]debug into kernel
代码庆端午--粽你心意
Completely remove MySQL tutorial
(Navigation page) OpenStack-M version - manual construction of two nodes - with video from station B