今天我正在和一个朋友谈论如何将目录添加到您的 PATH 中。因为我已经使用终端很长时间了,所以这对我来说是“显而易见的”,但是当我搜索如何执行此操作的说明时,我实际上找不到解释所有步骤的东西 – 很多人只是说“将其添加到~/.bashrc
”,但是如果您不使用 bash 怎么办?如果您的 bash 配置实际上位于不同的文件中怎么办?您应该如何确定要添加哪个目录?
因此,我想尝试写下一些更完整的指导,并提及我多年来遇到的一些问题。
这是一个目录:
第1步:你使用什么外壳?
如果您不确定自己使用的是什么 shell,可以通过以下方法找到答案。运行这个:
ps -p $$ -o pid,comm=
- 如果你使用bash ,它会打印出
97295 bash
- 如果您使用zsh ,它会打印出
97295 zsh
- 如果你使用的是fish ,它会打印出一个错误,比如“Infish,请使用$fish_pid”(
$$
在fish中不是有效的语法,但无论如何,错误消息会告诉你你正在使用fish,你可能已经知道了)
此外,bash 是 Linux 上的默认设置,zsh 是 Mac OS 上的默认设置(截至 2024 年)。我将仅介绍这些方向的 bash、zsh 和 Fish。
第 2 步:找到 shell 的配置文件
- 在 zsh 中,它可能是
~/.zshrc
- 在 bash 中,可能是
~/.bashrc
,但它很复杂,请参阅下一节中的注释 - 在fish中,它可能是
~/.config/fish/config.fish
(如果你想100%确定,你可以运行echo $__fish_config_dir
)
关于 bash 配置文件的注释
Bash 有三个可能的配置文件: ~/.bashrc
、 ~/.bash_profile
和~/.profile
。
如果您不确定您的系统设置为使用哪一个,我建议您通过以下方式进行测试:
- 将
echo hi there
添加到你的~/.bashrc
中 - 重新启动您的终端
- 如果您看到“hi There”,则意味着
~/.bashrc
正在被使用!万岁! - 否则删除它并尝试使用
~/.bash_profile
进行相同的操作 - 如果前两个选项不起作用,您也可以尝试
~/.profile
。
(有很多详细的流程图解释了 bash 如何决定使用哪个配置文件,但在我看来,这是不值得的,只是测试是最快的确定方法)
第 3 步:找出要添加的目录
假设您正在尝试安装并运行一个名为http-server
程序,但它不起作用,如下所示:
$ npm install -g http-server $ http-server bash: http-server: command not found
如何找到http-server
所在的目录?老实说,一般来说这并不那么容易——答案通常是“这取决于 npm 的配置方式”。一些想法:
- 通常,在设置新的安装程序(如
cargo
、npm
、homebrew
等)时,当您第一次设置它时,它会打印出一些有关如何更新 PATH 的说明。因此,如果您注意的话,您就可以获得指示。 - 有时安装程序会自动更新您的 shell 的配置文件以更新您的
PATH
- 有时只需谷歌搜索“npm 在哪里安装东西?”将会出现答案
- 有些工具有一个子命令,可以告诉您它们被配置为安装的位置,例如:
- Node/npm:
npm config get prefix
(然后附加/bin/
) - 去:
go env | grep GOPATH
(然后追加/bin/
) - asdf:
asdf info | grep ASDF_DIR
(然后附加/bin/
和/shims/
)
- Node/npm:
步骤 3.1:仔细检查它是正确的目录
一旦您找到了您认为可能正确的目录,请确保它确实正确!例如,我发现在我的机器上, http-server
位于~/.npm-global/bin
中。我可以通过尝试在该目录中运行程序http-server
来确保它是正确的目录,如下所示:
$ ~/.npm-global/bin/http-server Starting up http-server, serving ./public
成功了!现在您知道需要将哪个目录添加到PATH
中,让我们进入下一步!
第 4 步:编辑 shell 配置
现在我们有了所需的 2 条关键信息:
- 您尝试添加到 PATH 的目录(例如
~/.npm-global/bin/
) - shell 的配置在哪里(例如
~/.bashrc
、~/.zshrc
或~/.config/fish/config.fish
)
现在您需要添加的内容取决于您的 shell:
bash 和 zsh 说明:
打开 shell 的配置文件,然后添加如下行:
export PATH=$PATH:~/.npm-global/bin/
(显然将~/.npm-global/bin
替换为您要添加的实际目录)
鱼的使用说明:
在fish中,语法是不同的:
set PATH $PATH ~/.npm-global/bin
(在fish中你也可以使用fish_add_path
,下面有一些注释)
第 5 步:重新启动 shell
现在,一个极其重要的步骤:如果不重新启动 shell,更新配置将不会生效!
有两种方法可以做到这一点:
- 打开一个新终端(或终端选项卡),也许关闭旧终端,这样你就不会感到困惑
- 运行
bash
启动一个新的 shell(如果您使用 zsh,则运行zsh
;如果您使用fish
,则运行 Fish)
我发现这两种方法通常都能很好地工作。
你应该完成了!尝试运行您想要运行的程序,希望它现在可以运行。
如果没有,您可能会遇到以下几个问题:
问题1:运行了错误的程序
如果程序运行的版本错误,您可能需要将该目录添加到 PATH 的开头而不是末尾。
例如,在我的系统上安装了两个版本的python3
,我可以通过运行which -a
来查看它们:
$ which -a python3 /usr/bin/python3 /opt/homebrew/bin/python3
您的 shell 将使用的是列出的第一个。
如果您想使用 Homebrew 版本,则需要将该目录 ( /opt/homebrew/bin
) 添加到 PATH 的开头,方法是将其放入 shell 的配置文件中(它是/opt/homebrew/bin/:$PATH
而不是通常的$PATH:/opt/homebrew/bin/
)
export PATH=/opt/homebrew/bin/:$PATH
或在鱼中:
set PATH ~/.cargo/bin $PATH
问题 2:程序没有从您的 shell 运行
所有这些指示仅在您从 shell运行该程序时才有效。如果您从 IDE、GUI、cron 作业或其他方式运行程序,则需要以不同的方式将该目录添加到 PATH,具体细节可能取决于具体情况。
在 cron 作业中
一些选项:
- 使用您正在运行的程序的完整路径,例如
/home/bork/bin/my-program
- 将您想要的完整 PATH 作为 crontab 的第一行(类似于 PATH=/bin:/usr/bin:/usr/local/bin:…)。您可以通过运行
echo "PATH=$PATH"
来获取在 shell 中使用的完整 PATH。
老实说,我不确定如何在 IDE/GUI 中处理它,因为我已经很长时间没有遇到这个问题了,如果有人给我指出正确的方向,我会在这里添加说明。
关于source
的注释
当您第一次安装cargo
(Rust 的安装程序)时,它会为您提供有关如何设置 PATH 的说明,其中根本没有提及特定目录。
This is usually done by running one of the following (note the leading DOT): . "$HOME/.cargo/env" # For sh/bash/zsh/ash/dash/pdksh source "$HOME/.cargo/env.fish" # For fish
这个想法是,您将该行添加到 shell 的配置中,它们的脚本会自动为您设置PATH
(以及可能的其他内容)。
这很常见(例如Homebrew建议您 eval brew shellenv
),有两种方法可以解决此问题:
- 只需按照该工具的建议进行操作(例如将
. "$HOME/.cargo/env"
添加到 shell 的配置中) - 找出他们告诉您运行的脚本将添加到您的路径中的哪些目录,然后手动添加它们。我是这样做的:
- 跑步
. "$HOME/.cargo/env"
我的 shell 中的. "$HOME/.cargo/env"
(如果使用 Fish,则为 Fish 版本) - 运行
echo "$PATH" | tr ':' '\n' | grep cargo
找出它添加了哪些目录 - 看到它显示
/Users/bork/.cargo/bin
并将其缩短为~/.cargo/bin
- 将目录
~/.cargo/bin
添加到 PATH (使用本文中的说明)
- 跑步
我不认为按照该工具的建议进行操作有什么问题(这可能是“最好的方法”!),但就我个人而言,我通常使用第二种方法,因为我更喜欢确切地知道我正在更改的配置。
关于fish_add_path
的注释
Fish 有一个名为fish_add_path
的方便函数,您可以运行它来将目录添加到您的PATH
中,如下所示:
fish_add_path /some/directory
这会将目录添加到您的PATH
中,并使用新的PATH
自动更新所有正在运行的 Fish shell。您根本不必更新配置!这非常方便,但一个缺点(也是我个人停止使用它的原因)是,如果您需要在几周或几个月后从您的PATH
中删除该目录,因为您可能犯了一个错误,这是很难做到的(尽管在这个 github 问题的评论中有说明)。
就这样
希望这会对一些人有所帮助。如果您在将目录添加到 PATH 时遇到其他主要问题,或者您对本文有疑问,请告诉我(在 Mastodon 或 Bluesky 上)!
原文: https://jvns.ca/blog/2025/02/13/how-to-add-a-directory-to-your-path/