为什么Bash脚本需要一个执行位,而Windows批处理脚本只需要执行就可以了呢?
为什么Bash脚本需要一个执行位,而Windows批处理脚本只需要执行就可以了呢?
昨天我遇到了git执行位bash脚本的怪异情况——这个情况需要执行以下命令:
git update-index --add --chmod=+x scriptname.sh
对我来说,这种情况似乎很奇怪,竟然有可能陷入这种情况(即创建一个没有运行权限的脚本文件)。如果我创建了一个shell脚本,我肯定可以在shell执行权限下运行它。为什么它需要自己的执行权限位呢?
我的问题是:为什么bash脚本需要一个执行位,而Windows批处理脚本可以直接执行呢?
在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脚本了。
在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仅使用文件扩展名来检测可执行文件。