百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

带你了解企业是如何编写脚本的-第3篇:脚本的各种执行方式区别

liuian 2024-12-16 14:48 68 浏览

在上一篇中:带你了解企业是如何编写脚本的-第2篇:Shell脚本规范的结尾中,我大致说了一下不同的脚本执行方式,而这些执行方式的区别是什么呢?下面将通过简单的案例进行讲解!

首先我们回顾一下大致的几种执行方式:

  • 通过解析器调用执行脚本
  • 通过source获取脚本
  • 通过添加执行权限执行

其实不同的执行方式最主要的区别就在于进程和变量之间的关系,如果只是单独一个脚本文件,那么使用任何一个执行方式都是无差别的,但是如果是多个脚本文件之间进行调用,并且还涉及到变量、循环之类的则会对执行方式有一定的要求。


下面的案例均以多个脚本不同的调用方式进行演示,单脚本的执行只是姿势不一样而已,效果都是一样的

1、脚本内容

我创建两个脚本文件,第一个是主脚本:hello.sh,内容如下:

#!/bin/bash
echo "hello"
echo "当前脚本名称: [ $0 ]"
echo "当前脚本进程: [ $ ]"
echo "传入的参数是: [ $1 ]"
cmd="$1 /opt/liumou.sh"
$cmd
echo "调用结束,[ /opt/liumou.sh ]定义的变量 [ name=$name ]"

$0 #表示当前执行的脚本名称

$1 #则是我传入的执行/调用第二个脚本 的方式

第二个是/opt/liumou.sh,脚本内容如下:

#!/bin/bash
echo "刘某"
echo "当前脚本名称: [ $0 ]"
echo "当前脚本进程: [ $ ]"
echo "传入的参数是: [ $1 ]"
echo "当前调用方式: [ $cmd ]-->来自:[ /opt/liumou.sh ]"
name="坐公交也用券"


2、实现的效果

在hello.sh中,有一条命令是 $cmd ,这个变量是决定调用另一个脚本的方式,而这个值是在执行hello.sh的时候,通过1参进行传入的值决定实际的调用方式,下面分别使用不同的值进行调用,然后看他们之间的区别:

2.1、传入bash


此时可以看出来,通过bash的调用:

  • hello.sh的进程与liumou.sh的进程是不一样的
  • liumou.sh无法获取到hello.sh的变量
  • hello.sh也无法获取到liumou.sh的变量
  • 两个脚本显示的脚本名称是各自的名称:

也就是说:

通过bash这种调用方式,其实是将第二个脚本以一个新的进程进行,这个新的进程无法主进程共享变量、进程,它们是独立的,但是主脚本会等待子进程结束才会继续进行后面的操作(最后一句是由 hello.sh输出的)

2.2、通过source调用

命令如下:

bash /opt/hello.sh source


从结果可以看出,这次的信息是全部都有的,相比使用bash进行调用,这个source的调用则更像是把另一个脚本(liumou.sh)的内容加入到自己的脚本内容中,具体区别如下:


  • hello.sh的进程与liumou.sh的进程是一样的
  • liumou.sh可以获取到hello.sh的变量
  • hello.sh可以获取到liumou.sh的变量
  • 两个脚本显示的脚本名称是统一的名称(liumou.sh已经不出现了)

2.3、通过.调用

从结果来看,通过“.”的调用结果与通过" suorce ”的结果是一样的(变量与脚本名等),并且通过脚本进行调用的时候,被调用的脚本无需拥有执行权限。

3、通过添加权限的方式执行然后传入不同的调用方式

从结果来看,在主脚本的执行方式上,bash和. 的执行方式都是一样的,执行结果只会与调用第二个脚本的时候才有区别,所以主脚本执行的方式看你的习惯。

2.4、通过source执行


从执行结果来看,总体与其他的效果都一样,但是有两个区别:

1、主脚本无法获取到脚本名称

2、所有的进程PID都是一样的,不会因为调用方式而改变

3、总结

从上面的结果来看,我们可以得出以下总结:

3.1、单脚本

  • 执行方式使用添加权限(./hello.sh)或解析器调用(bash hello.sh)的结果都是一样的
  • source执行方式只建议对变量配置文件进行执行,不建议对程序脚本执行

3.2、脚本引用

  • 主脚本的执行方式与单脚本一样,哪个方便使用哪个,建议使用解析器调用,因为可以进行调试模式
  • 调用子脚本使用不同的调用方式会有不一样的结果,可以根据实际需求使用不同的方式,总体建议使用source

番外:调试模式


那么本期文章就到这里结束了,对于脚本的执行方式你觉得还有哪些需要补充呢?请在评论区说出来和大家一起讨论吧!

相关推荐

eino v0.4.5版本深度解析:接口类型处理优化与错误机制全面升级

近日,eino框架发布了v0.4.5版本,该版本在错误处理、类型安全、流处理机制以及代理配置注释等方面进行了多项优化与修复。本次更新共包含6个提交,涉及10个文件的修改,由2位贡献者共同完成。本文将详...

SpringBoot异常处理_springboot异常注解

在SpringBoot中,异常处理是构建健壮、可维护Web应用的关键部分。良好的异常处理机制可以统一返回格式、提升用户体验、便于调试和监控。以下是SpringBoot中处理异常的完整指...

Jenkins运维之路(Jenkins流水线改造Day02-1-容器项目)

这回对线上容器服务器的流水线进行了一定的改造来满足目前线上的需求,还是会将所有的自动化脚本都放置到代码库中统一管理,我感觉一章不一定写的完,所以先给标题加了个-1,话不多说开干1.本次流水线的流程设计...

告别宕机!零基础搭建服务器监控告警系统!小白也能学会!

前言本文将带你从零开始,一步步搭建一个完整的服务器指标监控与邮件告警系统,使用的技术栈均为业界主流、稳定可靠的开源工具:Prometheus:云原生时代的监控王者,擅长指标采集与告警规则定义Node_...

httprunner实战接口测试笔记,拿走不谢

每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试码同学抖音号:小码哥聊软件测试01开始安装跟创建项目pipinstallhttprunne...

基于JMeter的性能压测平台实现_jmeter压测方案

这篇文章已经是两年前写的,短短两年时间,JMeter开源应用技术的发展已经是翻天覆地,最初由github开源项目zyanycall/stressTestPlatform形成的这款测试工具也开始慢...

12K+ Star!新一代的开源持续测试工具!

大家好,我是Java陈序员。在企业软件研发的持续交付流程中,测试环节往往是影响效率的关键瓶颈,用例管理混乱、接口调试复杂、团队协作不畅、与DevOps流程脱节等问题都能影响软件交付。今天,给大家...

Spring Boot3 中分库分表之后如何合并查询

在当今互联网应用飞速发展的时代,数据量呈爆发式增长。对于互联网软件开发人员而言,如何高效管理和查询海量数据成为了一项关键挑战。分库分表技术应运而生,它能有效缓解单库单表数据量过大带来的性能瓶颈。而在...

离线在docker镜像方式部署ragflow0.17.2

经常项目上会出现不能连外网的情况,要怎么使用ragflow镜像部署呢,这里提供详细的步骤。1、下载基础镜像根据docker-compose-base.yml及docker-compose.yml中的i...

看,教你手写一个最简单的SpringBoot Starter

何为Starter?想必大家都使用过SpringBoot,在SpringBoot项目中,使用最多的无非就是各种各样的Starter了。那何为Starter呢?你可以理解为一个可拔插式...

《群星stellaris》军事基地跳出怎么办?解决方法一览

《群星stellaris》军事基地跳出情况有些小伙伴出现过这种情况,究竟该怎么解决呢?玩家“gmjdadk”分享的自己的解决方法,看看能不能解决。我用英文原版、德语、法语和俄语四个版本对比了一下,结果...

数据开发工具dbt手拉手教程-03.定义数据源模型

本章节介绍在dbt项目中,如何定义数据源模型。定义并引入数据源通过Extract和Load方式加载到仓库中的数据,可以使用dbt中的sources组件进行定义和描述。通过在dbt中将这些数据集(表)声...

docker compose 常用命令手册_docker-compose init

以下是DockerCompose常用命令手册,按生命周期管理、服务运维、构建配置、扩缩容、调试工具分类,附带参数解析、示例和关键说明,覆盖多容器编排核心场景:一、生命周期管理(核心命令...

RagFlow与DeepSeek R1本地知识库搭建详细步骤及代码实现

一、环境准备硬件要求独立显卡(建议NVIDIAGPU,8GB显存以上)内存16GB以上,推荐32GB(处理大规模文档时更高效)SSD硬盘(加速文档解析与检索)软件安装bash#必装组件Docker...

Docker Compose 配置更新指南_docker-compose配置

高效管理容器配置变更的最佳实践方法重启范围保留数据卷适用场景docker-composeup-d变更的服务常规配置更新--force-recreate指定/所有服务强制重建down→up流程...