shell脚本5种执行方式及脚本不同的执行方法和区别详解

目录
  • 前言
  • 概述
  • 正题
    • 一、方式1绝对路径和方式2相对路径,可以归纳为同一种方法
    • 二、方式3使用 sh/bash命令来执行
    • 三、方式4使用 . (空格)脚本名称来执行
    • 四、方式5使用 source 来执行(主要用于生效配置文件)
  • 区别
    • 1.关于执行权限
    • 2.关于是否开启子shell线程
  • 总结

前言

shell脚本是一种脚本语言,他不需要编译,而是直接通过解释器,将脚本作为解释器程序的参数运行的。

我们通过编写vim test.sh,然后用不同方法执行名为test.sh的脚本。

#!/bin/bash
echo "hello word"

概述

1)使用绝对路径执行。
2)使用相对路径执行。语法格式:./a.sh
3)使用 sh或bash命令来执行。语法格式: sh a.sh 不需要执行权限 -x参数(显示执行过程)
4)使用 . (空格)脚本名称来执行。 语法格式:. a.sh 不需要执行权限(特别注意:第一个.后面有空格)
5)使用 source 来执行。 语法格式:source a.sh 不需要执行权限(主要用于生效配置文件)

下面针对这5种方式,我们一起来看看它们的具体使用方式和区别吧!

正题

一、方式1绝对路径和方式2相对路径,可以归纳为同一种方法

注意:新创建的脚本,默认没有x执行权限,需要给它用#chmod +x test.sh的方式,添加执行权限。在生产环境中不要轻易的给文件可执行权限;

[root@centOS7 shell]# /root/test/shell/test.sh   #使用绝对路径
hello word
[root@centOS7 shell]# ./test.sh  #使用相对路径

二、方式3使用 sh/bash命令来执行

注意:该方式虽然不需要手动给脚本添加x执行权限,但是它会改变脚本默认解释器类型。比如说:脚本首行定义的是#!/bin/bash,使用该方式,它会给你改用/bin/sh解释器,也就说,最终效果=#!/bin/bash --posix

特别之处:该方式1.不需单独给脚本分配x执行权限;2.甚至都不需要在脚本首行声明脚本解释器类型,因为脚本是被当做该命令的参数使用的。

注:你可能会对/bin/bash和/bin/sh的区别感兴趣,点击这里。

ls
chomod -x test.sh  #给脚本移除x执行权限
ls
sh test.sh    #第3种方式运行
bash test.sh  #第3种方式运行

三、方式4使用 . (空格)脚本名称来执行

注:该方式,不需要单独添加x执行权限,它和source类似,权限继承与bash。

ls  #查看脚本(灰色的,说明没有x可执行权限)
. test.sh   #注意,点后面有个空格

四、方式5使用 source 来执行(主要用于生效配置文件)

ls  #查看脚本(灰色的,说明没有x可执行权限)
source test.sh   #该方式多用些操作,被修改后的配置文件(使之重新加载)

注意:

.和source的权限,继承的是/bin/bash的权限,在执行时也是将test.sh作为参数,并不需要test.sh有执行权限;和bash执行不一样的是,source和.不会创建子进程,是在当前shell进程下执行的,因为他们是内建命令,所以脚本中赋值的本地变量也会影响当前shell的,用的时候一定要注意(尽量使用前面的3种方式)。

区别

1.关于执行权限

仅前两种(相对路径、绝对路径)方法,需要chmod +x test.sh,给脚本单独添加x执行权限。后三种方法,均不需要单独添加x执行权限。

2.关于是否开启子shell线程

前三种方法,脚本执行时会开启一个子shell环境,在子shell执行完后,子shell环境随即关闭,然后又回到当前shell中。

后面两种. 和source方式,则是在当前shell中执行,不会开启子shell。

总结

到此这篇关于shell脚本5种执行方式及脚本不同的执行方法和区别的文章就介绍到这了,更多相关shell脚本执行方式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Linux中执行shell脚本的4种方法总结

    bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: 复制代码 代码如下: cd /data/shell ./hello.sh ./的意思是说在当前的工作目录下执行hello.sh.如果不加上./,bash可能会响应找到不到hello.sh的错误信息.因为目前的工作目录(/data/shell)可能不在

  • 执行Shell脚本的4种方法及区别介绍

    执行shell脚本有以下几种方式 1.相对路径方式,需先cd到脚本路径下 复制代码 代码如下: [root@banking tmp]# cd /tmp  [root@banking tmp]# ./ceshi.sh 脚本执行成功 2.绝对路径方式 复制代码 代码如下: [root@banking tmp]# /tmp/ceshi.sh 脚本执行成功 3.bash命令调用 复制代码 代码如下: [root@banking /]# bash /tmp/ceshi.sh 脚本执行成功 4.. (空格)

  • 防止shell脚本重复执行的代码

    例如,要求脚本只能顺序访问某个资源,例如磁盘文件等,就可以参考下面的实现. 复制代码 代码如下: #!/bin/bash## file locking using bash.# ver 0.1.6## author : malundao ( malundao@sina.com )# date   : 2011-08-31   # ref    : http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2005-09/0472.html## no

  • shell脚本4种执行方式

    Linux中shell脚本的执行通常有4种方式,分别为工作目录执行,绝对路径执行,sh执行,shell环境执行. 首先,看下我们的脚本内容 [tan@tan scripts]$ ll total 4 -rw-rw-r--. 1 tan tan 68 May 8 23:18 test.sh [tan@tan scripts]$ cat test.sh #!/usr/bin/bash /usr/bin/python <<-EOF print "Hello Shell" EOF

  • Linux下使用shell脚本自动执行脚本文件

    以下实例本人在Centos6.5 64位操作系统中使用 一.定时复制文件 a.在/usr/local/wfjb_web_back目录下创建 tomcatBack.sh文件 文件内容: #将tomcat中的应用wfjb_web 复制到 /usr/local/wfjb_web_back/tomcat_back/目录下 并按照日期作为文件名称 cp -af /usr/local/apache-tomcat-7.0.73/webapps/wfjb_web /usr/local/wfjb_web_back

  • Shell脚本中实现切换用户并执行命令操作

    今天公司同事来找到我说要在服务器上用另外一个用户执行python脚本,但设置到crontab里却老是root用户来执行,为了省事我就想了一个偷懒的办法,就是用shell脚本切换到那个用户,然后去执行那个python脚本.好了,这篇文章我只演示怎么用shell脚本切换到其他用户执行命令. 系统:centos 5.x 脚本内容: cat test.sh 复制代码 代码如下: #!/bin/bash su - test <<EOF pwd; exit; EOF 执行结果图: 当然也可以用下面的命令来

  • 详解shell中source、sh、bash、./执行脚本的区别

    1.source命令用法: source FileName 作用:在当前bash环境下读取并执行FileName中的命令.该filename文件可以无"执行权限" 注:该命令通常用命令"."来替代. 如:source .bash_profile . .bash_profile两者等效. source(或点)命令通常用于重新执行刚修改的初始化文档. source命令(从 C Shell 而来)是bash shell的内置命令. 点命令,就是个点符号,(从Bourne

  • shell脚本5种执行方式及脚本不同的执行方法和区别详解

    目录 前言 概述 正题 一.方式1绝对路径和方式2相对路径,可以归纳为同一种方法 二.方式3使用 sh/bash命令来执行 三.方式4使用 . (空格)脚本名称来执行 四.方式5使用 source 来执行(主要用于生效配置文件) 区别 1.关于执行权限 2.关于是否开启子shell线程 总结 前言 shell脚本是一种脚本语言,他不需要编译,而是直接通过解释器,将脚本作为解释器程序的参数运行的. 我们通过编写vim test.sh,然后用不同方法执行名为test.sh的脚本. #!/bin/ba

  • js截取字符串的两种方法及区别详解

    var long2="1988-0w-07"; alert(long2.substring(0,4)+"------"+long2.substring(5,6));   1988------0 alert(long2.substr(0,4)+"------"+long2.substr(5,2));            1988-----0w substring 截取的时候坐标  包括前边  不包括后边 substr    截取字符串前边参数的坐

  • linux shell中“.” 和 “./”执行的区别详解

    目前注意到的区别主要在于环境变量的作用域上: 1. 如果使用" ./ " 执行,可以理解为程序运行在一个全新的shell中,不继承当前shell的环境变量的值, 同时若在程序中改变了当前shell中的环境变量(不使用export),则当前shell的环境变量值不变. 2. 如果使用" . "执行,则程序继承当前shell中的环境变量,同时,若在程序中改变了当前shell中的环境变量(不使用export),则当前shell中该环境变量的值也会改变 另外一个区别点在于,

  • jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解

    本文实例讲述了jQuery autoComplete插件两种使用方式及动态改变参数值的方法.分享给大家供大家参考,具体如下: 一.一次加载.多次使用: 前端JS代码: /*客户名称自动匹配*/ function customerAutoComplete(){ $.ajax({ type:"GET", url:encodeURI("/approvalajax/salesOrderApproval_findCustomerList"), dataType:"j

  • 判断python对象是否可调用的三种方式及其区别详解

    查找资料,基本上判断python对象是否为可调用的函数,有三种方法 使用内置的callable函数 callable(func) 用于检查对象是否可调用,返回True也可能调用失败,但是返回False一定不可调用. 官方文档:https://docs.python.org/3/library/functions.html?highlight=callable#callable 判断对象类型是否是FunctionType type(func) is FunctionType # 或者 isinst

  • 使用axios请求接口,几种content-type的区别详解

    axios的使用 安装(一般使用框架的话, 脚手架都集成了) $ npm install axios 请求示例 // POST axios.post('/user', { firstName: 'Fred', lastName: 'Flintstone' }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); // GET axios.ge

  • R语言常用两种并行方法之parallel详解

    目录 并行计算 在模拟时什么地方可以用到并行? 怎么在R中看我们可以使用并行? parallel(简单) 由于最近在进行一些论文的模拟,所以尝试了两种并行的方法:parallel与snowfall,这两种方法各有优缺,但还是推荐snowfall,整体较为稳定,不容易因为内存不足或者并行线程过多等原因而报错. 并行计算 并行计算: 简单来讲,就是同时使用多个计算资源来解决一个计算问题,是提高计算机系统计算速度和处理能力的一种有效手段.(参考:并行计算简介) 一个问题被分解成为一系列可以并发执行的离

  • Java 添加Word目录的2种方法示例代码详解

    目录是一种能够快速.有效地帮助读者了解文档或书籍主要内容的方式.在Word中,插入目录首先需要设置相应段落的大纲级别,根据大纲级别来生成目录表.本文中生成目录分2种情况来进行: 1.文档没有设置大纲级别,生成目录前需要手动设置 2.文档已设置大纲级别,通过域代码生成目录 使用工具: •Free Spire.Doc for Java 2.0.0 (免费版) •IntelliJ IDEA 工具获取途径1:通过官网下载jar文件包,解压并导入jar文件到IDEA程序. 工具获取途径2:通过Maven仓

  • 对pandas中两种数据类型Series和DataFrame的区别详解

    1. Series相当于数组numpy.array类似 s1=pd.Series([1,2,4,6,7,2]) s2=pd.Series([4,3,1,57,8],index=['a','b','c','d','e']) print s2 obj1=s2.values # print obj1 obj2=s2.index # print obj2 # print s2[s2>4] # print s2['b'] 1.Series 它是有索引,如果我们未指定索引,则是以数字自动生成. 下面是一些例

  • Python之关于类变量的两种赋值区别详解

    我就废话不多说了,还是直接看代码吧! # -*- coding:utf-8 -*- #面试题,写一个方法,将一行字符串中所有的单词数量统计出来 class Person(object): TAG = "hello" p1 = Person() p2 = Person() print p1.TAG #第一种赋值方式 print p2.TAG print Person.TAG #第二种赋值方式 p1.TAG = "damn it" print p1.TAG print

随机推荐