当前位置: 首页 > news >正文

shell脚本运行方式 bash 和./区别

在 Linux 或 macOS 这类基于 Unix 的系统里,使用 ./ 运行脚本和使用 bash 运行脚本存在一些差异,下面为你详细说明:

1. 语法与使用方式

  • 使用 ./ 运行脚本
    若要使用 ./ 来运行脚本,需要确保脚本文件具备可执行权限,并且脚本文件的开头要指定解释器(例如 #!/bin/bash)。语法如下:
./script.sh
  • 使用 bash 运行脚本
    采用 bash 运行脚本时,脚本文件无需具备可执行权限,不过脚本文件的开头仍要指定解释器。语法如下:
bash script.sh

2. 可执行权限的要求

  • 使用 ./ 运行脚本
    此方法要求脚本文件拥有可执行权限。可以借助 chmod 命令为脚本文件添加可执行权限,示例如下:
chmod +x script.sh
  • 使用 bash 运行脚本
    该方法不要求脚本文件有可执行权限。即便脚本文件没有可执行权限,也能够使用 bash 来运行,例如:
bash script.sh

3. 解释器的指定

  • 使用 ./ 运行脚本
    脚本文件的开头必须指定解释器,不然系统无法知晓使用哪个程序来执行脚本。例如,在 Bash 脚本里,文件开头应写成 #!/bin/bash
  • 使用 bash 运行脚本
    虽然通常也会在脚本文件开头指定解释器,但使用 bash 运行脚本时,实际上是强制使用 Bash 作为解释器,所以即便文件开头指定的是其他解释器,也会以 Bash 来执行。

4. 环境变量和作用域

  • 使用 ./ 运行脚本
    脚本会在一个新的子 shell 中执行,这意味着脚本里设置的环境变量只在子 shell 内有效,不会影响到父 shell。
  • 使用 bash 运行脚本
    同样是在新的子 shell 中执行脚本,脚本里设置的环境变量也仅在子 shell 内有效,不会影响到父 shell。

示例说明

假设存在一个名为 test.sh 的脚本文件,内容如下:

#!/bin/bash
echo "Hello, World!"
  • 使用 ./ 运行脚本
chmod +x test.sh
./test.sh
  • 使用 bash 运行脚本
bash test.sh

使用 bash 命令运行脚本不需要脚本文件本身具备可执行权限,主要是基于以下原理:

执行机制差异

当你使用 bash 命令时,实际上是在明确告诉系统使用 bash 解释器来处理脚本文件。bash 作为一个已被系统认可并具备执行权限的程序,它可以读取并解释脚本文件里的内容。也就是说,系统执行的是 bash 程序,而脚本文件仅仅是作为 bash 程序的输入数据。

系统解析过程

在 Linux 或 macOS 这类系统中,文件的执行权限主要用于让系统明确是否可以直接将该文件当作可执行程序来运行。当你直接输入文件名(例如 ./script.sh)时,系统会检查文件的权限位。若文件没有可执行权限,系统就不会尝试执行它。

然而,当你使用 bash script.sh 时,系统会首先查找 bash 程序,由于 bash 通常存放在 /bin 或 /usr/bin 目录下,并且具备可执行权限,所以系统能够顺利执行 bash 程序。接着,bash 程序会读取 script.sh 文件的内容,并按照自身的规则来解释和执行这些内容,而不会依赖 script.sh 文件的可执行权限。

示例说明

假设存在一个名为 test.sh 的脚本文件,内容如下:

#!/bin/bash
echo "This is a test script."

当你使用 bash 命令运行这个脚本时,无需给 test.sh 文件添加可执行权限:

bash test.sh

系统会调用 bash 程序,bash 程序读取 test.sh 文件的内容并执行其中的命令,输出结果:

This is a test script.

综上所述,使用 bash 命令运行脚本时,系统执行的是 bash 程序,脚本文件仅作为输入数据,因此不需要脚本文件本身具备可执行权限。


文章转载自:

http://8UwbdbLa.sLzkq.cn
http://H2yK3xsj.sLzkq.cn
http://jlviEIMv.sLzkq.cn
http://FpVnqdcK.sLzkq.cn
http://2umt59P9.sLzkq.cn
http://8DW8yXNG.sLzkq.cn
http://JZIGIfxF.sLzkq.cn
http://eTRlWyXf.sLzkq.cn
http://6Iwxhlhd.sLzkq.cn
http://nBXyofRV.sLzkq.cn
http://eNqhtKX3.sLzkq.cn
http://F6qB9CFb.sLzkq.cn
http://Ne8M324c.sLzkq.cn
http://hmg8wBEb.sLzkq.cn
http://Qg1w53DN.sLzkq.cn
http://WmWZYjBM.sLzkq.cn
http://lKinTRNo.sLzkq.cn
http://7C5wGddr.sLzkq.cn
http://KO4zrnUE.sLzkq.cn
http://FMqIqQDI.sLzkq.cn
http://QeWZolKU.sLzkq.cn
http://FeTmt3t4.sLzkq.cn
http://3ryIGKNd.sLzkq.cn
http://xHiafMZX.sLzkq.cn
http://qve5j445.sLzkq.cn
http://QyDWHsGr.sLzkq.cn
http://eYJHLku2.sLzkq.cn
http://aulpRe47.sLzkq.cn
http://042Dt4Sq.sLzkq.cn
http://ggNLuUZA.sLzkq.cn
http://www.dtcms.com/a/89939.html

相关文章:

  • Java设计模式之状态模式
  • 一次由特殊字符引发的Minio签名问题排查
  • Docker多阶段构建:告别臃肿镜像的终极方案
  • git上传大文件到远程仓库中
  • 工作杂谈(十七)——研发阶段术语
  • 死亡并不是走出生命 而是走出时间
  • Xyz坐标系任意两个面之间投影转换方法
  • 基于vue.js开发的家庭装修管理系统开发与设计(源码+lw+部署文档+讲解),源码可白嫖!
  • 写作软件新体验:让文字创作更高效
  • Python:进程介绍及语法结构
  • 707.设计链表
  • 硬件基础--03_电流
  • 国央企如何识别并防范虚假贸易?
  • G 2024hubei province 学习到的内容
  • 重温Mqtt
  • Java试题
  • 关于金碟K3,禁用和启用需要流程审批后执行
  • 利用GitHub Pages快速部署前端框架静态网页
  • Chrome(Google) 浏览器安装Vue2、Vue3 Devtools插件方法
  • 工作记录 2017-03-07
  • java泛型的协变、逆变和不变
  • 3、pytest实现参数化
  • 架构设计-springboot和springcloud的使用场景与区别
  • 【数组】螺旋矩阵
  • 图解AI对话系统架构:一次讲透核心技术
  • 【读点论文】Object Storage on CRAQ
  • 2025最新-智慧小区物业管理系统
  • Excel多级联动下拉菜单的自动化设置(使用Python中的openpyxl模块)
  • 汤臣倍健业绩倒车:2024年利润下滑超六成,三大核心品牌销量失守
  • acwing112:三种排序方法解决组合排序问题