如何在Linux中将目录添加到$ PATH

时间:2020-01-09 10:44:53  来源:igfitidea点击:

$ PATH是Linux计算机背景中的无声操纵器之一。它会悄悄地影响用户体验,但是并没有什么阴暗面。我们将解释它的作用以及如何进行调整。

什么是Linux上的$ PATH,它如何工作?

当在终端窗口中键入命令并按Enter时,我们甚至在执行命令之前就开始了大量的活动。

Bash是大多数Linux发行版上的默认Shell。它解释我们输入的文本行,并标识与参数,管道,重定向以及其中任何其他内容混合在一起的命令名称。然后,找到这些命令的可执行二进制文件,并使用我们提供的参数启动它们。

Shell定位可执行文件所采取的第一步是确定是否包含二进制文件。如果我们使用的命令在shell程序本身(内置的shell程序)中,则无需进一步搜索。

Shell内置程序最容易找到,因为它们是Shell不可或者缺的。就像将它们带入工具带一样,它们始终与我们同在。

但是,如果我们需要其他工具之一,则必须在车间中翻找才能找到它。是放在工作台上还是挂在墙上?这就是$ PATH环境变量的作用。它包含shell搜索的位置列表以及搜索它们的顺序。

如果要查看命令是内置的shell,别名,函数还是独立的二进制mv / work / unfile,则可以使用" type"命令,如下所示:

type clear
type cd

这告诉我们" clear"是一个二进制文件,并且在路径中找到的第一个文件位于" / usr / bin"。计算机上可能安装了多个版本的clear,但这是Shell会尝试使用的版本。

毫不奇怪,cd是内置的shell。

列出$ PATH

很容易看到路径。只需键入以下命令即可使用echo命令并打印$ PATH变量中保存的值:

echo $PATH

输出是用冒号()分隔的文件系统位置的列表。 Shell通过路径从左到右搜索,检查每个文件系统位置是否有匹配的可执行文件来执行命令。

我们可以通过列表选择方法,以查看将要搜索的文件系统位置以及搜索顺序:

  • / usr / local / sbin

  • / usr / local / bin

  • / usr / sbin

  • / usr / bin

  • / sbin

  • / bin

  • / usr / games

  • / usr / local / games

  • / snap / bin

可能不会立即显而易见的是搜索不在当前工作目录中开始。而是通过列出的目录(仅列出的目录)工作。

如果当前工作目录不在路径中,则不会搜索该目录。另外,如果我们将命令存储在不在路径中的目录中,则Shell将找不到它们。

为了证明这一点,我们创建了一个名为" rf"的小程序。当执行时,rf在终端窗口中打印从中启动目录的名称。它位于/ usr / local / bin中。我们在/ dave / work目录中也有一个较新的版本。

我们键入以下"哪个"命令来向我们展示shell将找到并使用哪个程序版本:

which rf

shell程序报告找到的版本是路径中目录中的版本。

我们输入以下内容来启动它:

rf

rf版本1.0运行并确认我们的期望是正确的。找到并执行的版本位于/ usr / local / bin中。

要在此计算机上运行任何其他版本的rf,我们必须在命令行上使用可执行文件的路径,如下所示:

./work/rf

现在我们已经告诉shell其中可以找到我们想要运行的rf版本了,它使用的是1.1版本。旧的。

假设我们正在开发rf的新版本。在开发和测试时,我们需要经常运行它,但是我们不想将未发布的开发版本复制到实时环境中。

或者,也许我们已经下载了新版本的rf,并希望对其进行一些验证测试,然后再将其公开发布。

如果将工作目录添加到路径,则使shell程序找到我们的版本。并且此更改仅会影响其他人仍将使用/ usr / local / bin中的rf版本。

将目录添加到$ PATH

我们可以使用export命令将目录添加到$ PATH中,然后该目录包含在shell搜索的文件系统位置列表中。当shell程序找到匹配的可执行文件时,它将停止搜索,因此我们需要确保先搜索目录,然后是/ usr / local / bin。

这很容易做到。对于我们的示例,我们键入以下命令将目录添加到路径的开头,因此它是搜索到的第一个位置:

export PATH=/home/dave/work:$PATH

该命令将$ PATH设置为等于我们要添加的目录,/ home / dave / work,然后是整个当前路径。

第一个PATH没有美元符号($)。我们为" PATH"设置值。最后的$ PATH具有美元符号,因为我们引用的是存储在PATH变量中的内容。另外,请注意新目录和$ PATH变量名之间的冒号(::)。

让我们看看现在的路径是什么样的:

echo $PATH

我们的/ home / dave / work目录被添加到路径的开头。我们提供的冒号将路径的其余部分分隔开。

我们输入以下内容来验证我们的rf版本是找到的第一个版本:

which rf

布丁中的证明正在运行rf,如下所示:

rf

Shell找到版本1.1并从/ home / dave / work中执行它。

要将目录添加到路径的末尾,只需将其移至命令末尾,如下所示:

export PATH=$PATH:/home/dave/work

永久进行更改

正如Beth Brooke-Marciniak所说,成功固然很好,但成功却是短暂的。关闭终端窗口后,对$ PATH所做的任何更改都将消失。为了使它们永久存在,我们必须将export命令放入配置文件中。

当将export命令放入.bashrc文件时,每次打开终端窗口时,它都会设置路径。与必须登录的SSH会话不同,这些会话称为交互式会话。

过去,我们需要在.profile文件中放置export命令,以设置登录终端会话的路径。

但是,我们发现,如果将export命令放在.bashrc或者.profile文件中,它将正确设置交互式会话和登录终端会话的路径。经验可能有所不同。为了处理所有可能发生的情况,我们将在两个文件中向我们展示如何进行处理。

在/ home目录中使用以下命令来编辑.bashrc文件:

gedit .bashrc

打开gedit编辑器,并加载.bashrc文件。

滚动到文件的底部,然后添加以下我们先前使用的导出命令:

export PATH=/home/dave/work:$PATH

保存文件。接下来,关闭并重新打开终端窗口,或者使用dot命令读取.bashrc文件,如下所示:

。 .bashrc

然后,键入以下" echo"命令以检查路径:

echo $PATH

这会将/ home / dave / work目录添加到路径的开头。

将命令添加到.profile文件的过程是相同的。键入以下命令:

gedit .profile

gedit编辑器在加载.profile文件后启动。

将" export"命令添加到文件底部,然后保存。关闭和打开新的终端窗口不足以强制重新读取.profile文件。为了使新设置生效,我们必须注销并重新登录,或者使用" dot"命令,如下所示:

. .profile

为所有人设定PATH

要为使用系统的每个人设置路径,我们可以编辑/ etc / profile文件。

我们将需要使用sudo,如下所示:

sudo gedit /etc/profile

gedit编辑器启动时,将export命令添加到文件底部。

保存并关闭文件。更改将在其他人下次登录时生效。