如何在Linux中将目录添加到$ PATH
$ 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命令添加到文件底部。
保存并关闭文件。更改将在其他人下次登录时生效。