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

在命令行上键入命令时,基本上是在告诉Shell运行指定名称的可执行文件但是shell如何知道要搜索可执行程序的目录是什么,还是shell在整个文件系统中搜索

4 min read
如何在Linux中将目录添加到PATH

在命令行上键入命令时,基本上是在告诉Shell运行指定可执行文件的名称。在Linux中,这些可执行程序,如lsfindfile等,在你的系统上几个不同的目录。这些目录中存储着具有可执行权限的文件都可以从任何位置运行。

常见包含有可执行文件的目录是/bin/sbin/usr/sbin/usr/local/bin/usr/local/sbin

但是shell如何知道要搜索可执行程序的目录是什么,还是shell在整个文件系统中搜索?答案很简单。当您键入命令时,shell程序会在用户$PATH变量中指定的所有目录中搜索该名称的可执行文件。

本教程介绍了如何在Linux系统中向您的$PATH添加目录。向用户或全局的$PATH变量添加新目录非常简单。这使您可以执行存储在非标准位置的命令和脚本,而无需输入可执行文件的完整路径。

你可以使用echo或者printenv打印当前的$PATH变量。在~/.zshrc~/.bashrc配置文件修改$PATH环境变量只对当前用户生效。在/etc/environment/etc/profile配置文件修改$PATH环境变量将对所有用户生效。也可以使用source 命令修改$PATH变量,直接在当前的shell会话中生效。

相同的说明适用于任何Linux发行版,包括Ubuntu,CentOS,RHEL,Debian和Linux Mint。

Linux中$PATH的有什么

$PATH环境变量是一个冒号分隔的列表,告诉shell哪些目录是用于搜索可执行文件。要查看$PATH包含的目录,您可以使用printenvecho命令:

echo $PATH

输出将如下所示:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

如果您在两个不同的目录中有两个共享相同名称的可执行文件,则Shell将运行从$PATH搜索到的第一个目录执行该文件。

将目录添加到您的$PATH

在某些情况下,您可能需要添加其他目录$PATH变量。例如,某些程序可能安装在不同的位置,或者您可能想要为您的个人方便建创建一个目录。但是为了能够在不指定可执行文件绝对路径的情况下运行它们。为此,您只需要将目录添加到$PATH变量中。

假设您的家目录中有一个名为bin的目录,要将目录添加到您的$PATH ,请输入:

export PATH="$HOME/bin:$PATH"

export命令会将修改后的变量导出到Shell子进程环境。

现在,您只需键入可执行脚本名称即可运行脚本,而无需指定可执行文件的完整路径。但是,此更改只是临时的,仅在当前的Shell会话中有效。

要使更改永久生效,您需要在shell配置文件中定义$PATH变量。在大多数Linux发行版中,当您启动新会话时,将从以下文件中读取环境变量:

  • 全局Shell的配置文件,例如/etc/environment/etc/profile。如果要将新目录添加到所有系统用户,请在此文件修改$PATH
  • 特定于每用户shell的配置文件。例如,如果使用的是Bash,则可以在~/.bashrc文件中修改$PATH变量,如果使用的是Zsh,则文件名为~/.zshrc

在此示例中,我们将在~/.bashrc文件中设置变量。我们使用echo命令tee命令追加内容export PATH="$HOME/bin:$PATH~/.bashrc文件即可:

echo 'export PATH="$HOME/bin:$PATH"' | tee -a ~/.bashrc
~/.bashrc

使用以下source命令将新文件加载到当前的shell会话中:

source ~/.bashrc

要确认目录已成功添加,请键入以下命令打印您的$PATH变量的值:

echo $PATH

结论

向用户或全局的$PATH变量添加新目录非常简单。这使您可以执行存储在非标准位置的命令和脚本,而无需键入可执行文件的完整路径。相同的说明适用于任何Linux发行版,包括Ubuntu,CentOS,RHEL,Debian和Linux Mint。如有任何疑问,请随时发表评论。