运行不可执行的脚本
1. 概述
如果 shell 脚本不可执行,我们不能直接在终端中运行它。当然,可以更改脚本的执行权限,以便我们可以运行它。但是,这可能并不总是可能的。例如,如果脚本属于另一个用户,我们可能没有必要的权限来使用chmod 命令更改脚本的执行权限。
在本教程中,我们将讨论运行不可执行的脚本。
2. 分析问题
如果我们有一个可执行脚本,我们可以直接在终端中运行它。假设我们有以下脚本hello_world.sh:
#!/bin/bash
echo “Hello World"
该脚本仅打印Hello World并退出。我们在shebang (#!)之后的第一行指定脚本的解释器。在我们的例子中,解释器是/bin/bash。这告诉操作系统使用 Bash 作为解释器来解析脚本的其余部分。**
我们先检查一下这个脚本的执行权限:
$ ls –l hello_world.sh
-rwxr-xr-x 1 alice alice 31 May 6 08:32 hello_world.sh
由于脚本的执行权限是为所有用户设置的,我们可以直接在终端运行:
$ ./hello_world.sh
Hello World
现在,我们将考虑脚本不可执行的情况。首先,让我们使用chmod删除脚本hello_world.sh的执行权限:
$ chmod -x hello_world.sh
$ ls –l hello_world.sh
-rw-r--r-- 1 alice alice 31 May 6 08:32 hello_world.sh
从ls –l命令的输出可以明显看出,没有人——甚至是脚本的所有者——都有权执行这个脚本。让我们尝试运行它:
$ ./hello_world.sh
-bash: ./hello_world.sh: Permission denied
我们的目标是在本教程的其余部分运行脚本hello_world.sh。
3. 明确指定shell
运行我们没有执行权限的脚本的一种方法是在运行脚本时显式指定 shell。让我们使用 Bash 解释器运行脚本hello_world.sh:
$ /bin/bash ./hello_world.sh
Hello World
如我们所见,虽然没有设置脚本的执行权限,但我们能够运行它。但是,运行它有点不方便,因为我们必须在命令行上指定解释器。在这里,我们明确指定了解释器*/bin/bash*,它执行脚本。
如果我们能够在运行脚本时指定解释器,我们可以使用另一个解释器运行脚本,例如Korn shell :
$ /bin/ksh ./hello_world.sh
Hello World
在这种情况下,我们在运行脚本时指定的解释器*/bin/ksh*会覆盖脚本中在 shebang 之后指定的解释器。
对于这个简单的脚本,使用 Bash 和 Korn shell 运行脚本是成功的,但情况可能并非总是如此。不同 shell 的语法可能不完全兼容。
4. source脚本
**另一种运行不可执行脚本的方法是使用source 命令。**让我们使用source运行脚本hello_world.sh:
$ source ./hello_world.sh
Hello World
如我们所见,我们运行了一个不可通过source执行的脚本。
获取脚本意味着我们在当前 shell 中运行脚本。因此,如果脚本包含exit 命令,我们必须小心,因为我们可能会从当前 shell 本身退出。
我们可以使用点或句点字符 (.) 代替source并获得相同的结果:
$ . ./hello_world.sh
Hello World