在 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
程序,脚本文件仅作为输入数据,因此不需要脚本文件本身具备可执行权限。