我们为什么要使用./(点斜杠)在当前目录中运行脚本
1. 概述
在本教程中,我们将学习何时以及如何使用“ ./ ”在 Linux 中运行脚本。我们还将解释路径搜索在一般的 Linux 中是如何工作的,特别是在 Bash 中。
2. 为什么我们需要 ./ 来运行文件?
假设我们要运行script.sh文件,该文件是一个可执行文件并且位于当前目录中。让我们在不提及任何路径的情况下运行这个可执行文件:
$ script.sh
-bash: script.sh: command not found
**尽管我们与script.sh文件位于同一目录中,但 Bash 找不到该文件。**因此,**我们需要指定文件的相对或绝对路径,**以便 shell 知道我们的可执行文件在哪里。
在 Linux 中,点字符 (.) 表示当前目录。现在让我们调用我们的脚本,包括它作为文件的路径:
$ ./script.sh
The program run successfully.
请注意“.”后面的斜杠 (/)。**斜杠是 Linux 中的路径分隔符。我们用它来分隔当前目录 (.) 和文件名。*没有它,我们有.script.sh*来表示隐藏文件。
现在是时候回答我们之前的问题了。为什么我们需要*./*?因为我们的**当前目录不包含在$PATH **中。
3. 系统可执行文件与用户可执行文件
$PATH变量是一个包含路径列表的环境变量。我们来看看它的典型内容:
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
$PATH包含系统命令(如ls )的路径,因此我们不需要在每次执行时都包含它们的路径。Linux 将在$PATH中指定的路径中搜索可执行文件并运行该文件,如果找不到,请告知我们:
$ ls
File1 File2 log
请注意,如果两个路径包含所需的可执行文件,Linux 将使用*$PATH*中出现的第一个路径。
此外,我们可以使用which 命令来获取可以使用*$PATH*找到的任何命令的完整路径:
$ which ls
/bin/ls
4. 搜索规则
在寻找可执行文件时,Linux Bash 中有一条规则我们需要记住:
- 如果路径名中存在斜杠字符,则不要在*$PATH中搜索*
- 如果斜杠不在路径名中,则仅在*$PATH中搜索*
这意味着我们可以拥有与系统命令同名的脚本,例如,并在当前目录中运行它们而不会发生任何冲突。
例如,我们可以在当前目录中创建一个名为ls的脚本并运行如下:
$ ./ls
This is a sample script for ls.
请注意,因为我们在文件名之前指定了“/”,所以 Bash 将在我们指定的路径中搜索。在这种情况下是当前目录。
我们还可以运行系统命令ls,它会列出当前目录下的所有文件和文件夹:
$ ls
File1 File2 log ls
在这种情况下,Bash 将搜索*$PATH变量中包含的路径,因为 / 不在路径名中。**请注意,结果中的ls*文件是我们之前的示例脚本。**
我们可以使用export 将当前目录(“.”)添加到$PATH*变量中,但不推荐这样做*。作为 ”。” 因我们所在的目录而异,可能会导致安全问题。
5. 在*$PATH* 包含时的安全问题
假设我们将当前目录添加到*$PATH*。如果我们把“.” 作为*$PATH中的第一个路径,我们的ls示例文件将运行而不是外部命令ls*:
$ ls
This is a sample script for ls.
如果我们在系统上运行ls,我们要确保我们正在运行系统ls,而不是另一个用户名为ls的可执行文件。有人可以在这个ls文件中放入恶意代码来删除或修改我们的文件。因此,这是一个安全问题。
*我们可以把“.”作为$PATH*中的最后一条路径。**在这种情况下,系统命令 ls 将运行。前面的问题解决了,但安全问题可能仍然存在。
例如,如果我们在终端中有一个类似sl的错字,而不是得到一个错误,当前目录中可能存在一个名为sl的病毒,我们不知道:
$ sl
This could be a virus.
6. Windows 与 Linux
Windows PATH变量默认包含当前目录。因此,Windows 命令提示符 ( cmd ) 首先在当前目录中搜索,然后在外部命令中搜索。
虽然在当前目录中执行程序很常见,但 Bash 不会搜索当前目录中存在的文件,我们需要明确指定文件的路径。因此,与 Windows 不同,由于我们上面提到的潜在问题,当前目录默认不包含在 Linux $PATH中。