使用 ./ (点斜杠)执行脚本文件?
概述
在本教程中,我们将学习如何在 Linux 中使用 / (点斜杠)命令执行文件。这是 Linux 中最常用的命令之一,使用起来非常简单。让我们首先了解点斜杠是什么意思?
Linux 命令中的点斜杠是什么意思?
点斜杠或正斜杠 (/),如您所知,用于分隔目录和文件。例如:如果我有一个名为“/home/user1/Desktop”的目录,那么当我在此目录上键入 ls -l 时,它将显示该目录的所有内容,如下所示:
-rwxr-xr-x 1 user1 user1 0 Jun 12 19:09 Desktop
如果我只想列出该目录内的文件,我可以键入 ls –l /home/user1/desktop 来实现。上述命令将给出与下面相同的输出:
drwxr-xr-xs 2 user1 user1 4096 Jun 12 19:09 desktop
为什么我们需要 ./ 来运行文件?
我们将使用命令行执行 script.sh 文件。我们不会提及任何路径。
$ script.sh -bash: script.sh: command not found
由于我们位于与 script.sh 相同的目录中,Bash 能够找到 script.sh 文件。但是,由于 script.sh 文件不存在,我们必须通过指定其位置来告诉 Bash 在哪里查找 script.sh 文件。
在使用 Linux 时,.(点)符号表示当前工作文件夹。现在假设我们想从当前工作文件夹中运行我们的脚本。
$ ./script.sh The program run successfully.
请注意正斜杠 (/)。正斜杠用于在 Unix/Linux 系统中表示目录。它们还用于分隔文件名。在本例中,它们用于分隔脚本文件名和 .sh 扩展名。如果没有它们,我们将最终得到一个名为 "./script.sh" 的文件。
现在是时候回答我们之前的问题了。为什么我们要/需要将我们的当前目录添加到 $PATH?因为我们的当前目录未包含在 $PATH 中。
系统可执行文件与用户可执行文件
$PATH 变量通常包含程序所在的每个目录的路径。让我们看一下它的典型内容:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
$PATH 用于指定系统命令(如 ls)的位置。在 Linux 系统上,shell 会在 $PATH 环境变量中列出的目录中搜索命令。如果在那里找不到命令,则 shell 会尝试从当前目录运行命令。
$ ls File1 File2 log
如果有多个路径包含可执行文件,Linux 将选择在 $PATH 中找到的第一个可执行文件。
您还可以使用 which 来获取任何程序的完整路径,这些程序可以通过在 shell 提示符下键入其名称来运行。
$ which ls /bin/ls
搜索规则
在 Linux 中搜索可执行文件时,有一个名为 which 的命令可以帮助我们记住一件重要的事情:
如果文件名中存在斜杠 (/) 字符,则不要在 $PATH 中搜索该文件。
如果 PATH 变量中不存在斜杠,则只在当前目录中搜索。
我们可以拥有与命令完全相同的名称的脚本,例如,并在当前目录中执行它们,而不会发生冲突。
例如,假设我们要编写一个名为“ls”的 shell 命令,该命令列出我们当前目录中的文件。然后,我们可以将以下内容键入我们的终端窗口:
$ ./ls
这是一个 ls 的示例脚本。
因为我们在文件名之前指定了“/”,所以 Bash 将在当前工作目录中搜索指定的文件名。
您还可以使用系统命令“ls”来列出当前文件夹中的所有文件和文件夹。
$ ls File1 File2 log ls
如果我们不带任何参数运行该命令,Bash 将搜索 $PATH 环境变量中列出的目录中的文件。
您可以通过导出将当前工作目录(“.”)添加到 $PATH 环境变量,但这最好避免这样做,因为它可能导致安全问题。
在 $PATH 中包含 . 时的安全问题
假设我们将当前工作目录添加到 $PATH。如果我们将“.”作为 PATH 中的第一个条目,那么将执行我们的 ls 示例,而不是真正的 ls 命令。
$ ls
这是一个 ls 的示例脚本。
如果我们运行 ls −l,我们希望确保我们确实正在运行 ls 命令,而不是其他名为 ls 的可执行文件。有人可能会将恶意代码放入 ls 可执行文件中以删除我们的文件或更改其内容。因此,这是一个潜在的安全威胁。
我们可以将“.”添加到我们的 $PATHS 变量中,以便系统命令 `ls` 和 `grep` 都可以工作。但是我们仍然可能会遇到一些安全问题。
如果我们在终端中键入“sl”,而不是收到“非法命令”或“找不到命令”的响应,那么当前工作文件夹中可能存在我们不知道的恶意程序“sl”。
$ sl
这可能是一个病毒。
Windows 与 Linux
默认情况下,Windows PATH 变量包含当前目录。因此,当您从 Windows 控制台运行程序时,它会在查找其他位置之前查找当前目录中的程序。
与 Windows 不同,在 Windows 中,当前目录会自动添加到系统的 $PATHS 变量中,而在 Linux 中,当前目录不会自动添加到系统的 $PATHS 变量中。要将当前目录包含在系统的环境变量中,我们必须使用 export 命令手动将其添加到系统的 $PATHS 变量中。
结论
我们学习了如何使用 "./" 在当前工作目录中执行 shell 命令。因为当前目录不在 $PATHS 变量中,所以我们必须指定文件的相对路径或绝对路径。然后,我们介绍了 Linux 中的搜索规则,该规则解释了如何使用 grep 命令进行搜索。我们讨论了如果我们将“.”添加到 $PATH 环境变量中可能发生的一些安全风险。
最后,始终最好明确指定我们要运行可执行文件的位置。当运行多个用户帐户时,检查 PATH 环境变量是否包含“.”是个好主意。