为什么Bash脚本需要一个执行位,而Windows批处理脚本只需要执行就可以了呢?

16 浏览
0 Comments

为什么Bash脚本需要一个执行位,而Windows批处理脚本只需要执行就可以了呢?

昨天我遇到了git执行位bash脚本的怪异情况——这个情况需要执行以下命令:

git update-index --add --chmod=+x scriptname.sh

对我来说,这种情况似乎很奇怪,竟然有可能陷入这种情况(即创建一个没有运行权限的脚本文件)。如果我创建了一个shell脚本,我肯定可以在shell执行权限下运行它。为什么它需要自己的执行权限位呢?

我的问题是:为什么bash脚本需要一个执行位,而Windows批处理脚本可以直接执行呢?

0
0 Comments

在Linux中,文件系统支持可执行位来区分可执行文件和纯数据文件,并控制用户|组|其他用户的执行权限。如果你想要执行一个脚本,你可以在脚本名之前加上你想要启动它的shell/binary的名称,但是如果你想要使用./scriptname.sh的方式执行脚本,或者从路径中执行脚本,它需要被标记为可执行,对于你作为所有者|组成员|其他用户来说,对于脚本来说通常在第一行的shebang中定义了用于启动脚本的解释器:#!/bin/bash

然而,Windows的批处理脚本不需要这样的标记,可以直接执行。这是因为Windows和Linux使用不同的文件系统和执行机制。在Windows上,批处理脚本是由命令提示符(cmd.exe)解释和执行的,并且Windows文件系统不像Linux文件系统那样使用可执行位来区分可执行文件和数据文件。

所以,为了在Linux上执行bash脚本,我们需要将脚本标记为可执行,并在脚本的第一行添加shebang来指定使用哪个解释器来执行脚本。这样,当我们使用./scriptname.sh的方式执行脚本时,系统会根据shebang指定的解释器来执行脚本。

解决方法很简单,我们只需要使用以下命令将脚本标记为可执行:

chmod +x scriptname.sh

然后,在脚本的第一行添加shebang:

#!/bin/bash

这样,我们就可以像执行其他可执行文件一样执行bash脚本了。

0
0 Comments

在Unix-like系统中,运行脚本有两种选项。第一种选项是使用直接的解释器调用,将脚本作为参数。

# 运行bash脚本
bash test.sh
# 运行python脚本
python test.py

第二种选项是将文件标记为可执行,使用执行位,然后进行调用,如下所示:

# 示例bash脚本
./test.sh
# 示例python脚本
./test.py

在此之后,系统会尝试为您找到正确的解释器。为此,使用脚本的第一行“shebang”。

Bash示例:

#!/bin/bash
# 指向已安装的bash解释器 - bash示例

Python示例:

#!/usr/bin/python
# 指向已安装的python解释器

对于您的问题,Windows仅使用文件扩展名来检测可执行文件。

0