如何在Mac中将/usr/local/bin添加到$PATH?

116

在终端中执行'open .profile'时,我得到了以下内容:

export PATH=$PATH:/usr/local/git/bin 

我现在在Mac上安装了node.js,它提示我:

确保 /usr/local/bin 在你的 $PATH 中。

我该如何将 /usr/local/bin 添加到 export PATH=$PATH:/usr/local/git/bin 中?


28
我已投票支持重新打开这个问题。它涉及到Node.js以及程序员使用的工具Git。 - KatieK
9
好的。如果不在这里,那在哪里。 - bobobobo
7
一个小信息:我不知道早期版本的OS X,但至少在Yosemite中,默认情况下包括/usr/local/bin在$PATH中。您可以通过运行echo $PATH来检查$PATH中有什么内容。 - Ross Henderson
MacOS 会从 /etc/paths 中生成 PATH(部分),在那里你会找到 /usr/local/bin、/usr/bin、/bin、/usr/sbin 和 /sbin。请参阅(https://apple.stackexchange.com/questions/79306)。 - TextGeek
echo $PATH 将打印您的路径。如果在某些冒号之间看到 /usr/local/bin,则它在您的路径中。来源:https://dev59.com/HGIk5IYBdhLWcg3wg-fK#19202049 - Mark Gavagan
6个回答

132

PATH变量保存由冒号分隔的目录列表,所以如果你想添加多个目录,只需在它们之间加上冒号:

export PATH=$PATH:/usr/local/git/bin:/usr/local/bin

这种语法适用于任何 Bourne 兼容的 shell(sh、ksh、bash、zsh 等)。但是 zsh 是最近版本 MacOS 的默认 shell,它还以另一种方式公开 PATH - 作为名为(小写)$path 的变量,它是一个数组而不是单个字符串。因此,你可以使用以下代码:

path+=(/usr/local/git/bin /usr/local/bin) 

无论哪种情况,您可能希望在添加之前检查目录是否已经在PATH中。以下是使用通用语法的示例:

for dir in /usr/local/git/bin /usr/local/bin; do
   case "$PATH" in 
     $dir:*|*:$dir:*|*:$dir) :;; # already there, do nothing
     *) PATH=$PATH:$dir          # otherwise add it
   esac
done

以下是 zsh 特定版本的示例:

for dir in /usr/local/git/bin /usr/local/bin; do
  if (( ${path[(i)$dir]} > $#path )); then
    path+=($dir)
  fi
done

但是在Zsh中,您还可以将数组变量标记为仅接受唯一条目:

typeset -TU PATH path

甚至可以使您自己的类似路径的变量在数组中反映出来:

typeset -TU PYTHONPATH pythonpath

9
虽然你可以这样做,但这不是OS X的惯用方式。在OS X上,路径是使用/usr/libexec/path_helper构建的,并从默认的/etc/profile中调用。 请查看man path_helper,然后将您的路径添加到/etc/paths.d目录中的文件中。你会发现其他操作系统中几乎每个路径设置示例都包含$PATH,因为它们似乎都不能保证自己是链中的第一个... - Synchro
1
我只是在回答如何将多个目录添加到PATH的问题。您还可以在/etc/paths.d中创建多个条目或单个条目,每行一个目录,但这并不能帮助您在提示符下完成操作,而且只是间接实现相同的事情。此外,即使该问题标记为“osx”,这种方法也具有在Linux和其他类UNIX系统上工作的优点。 - Mark Reed
我在Linux上发现的问题是它非常不一致,不是一个好的示范。你会发现不同的来源告诉你要使用.profile、.bashrc、/etc/profile、/etc/environment等等,而且没有人愿意承担责任说“这是设置系统路径的正确位置”,所以你最终采取了交叉手指并希望的方法,在所有地方添加$PATH,特别是在程序中。从homebrew安装npm,路径会神奇地工作,因为它是正确的方式。 - Synchro
谢谢 - 对我有用。我通过运行 node --version 确认了它。 - marika.daboja
非常感谢...我不知道有ZSH版本。我来自bash背景,从未花时间学习ZSH。好知道! - Ziyan Junaideen
要明确的是,在zsh中,bash版本可以正常工作。但是zsh也将PATH(和其他类似路径的变量,包括CDPATH、FPATH和MODULE_PATH)公开为数组,以便更轻松地进行操作。 - Mark Reed

23

尝试将$PATH放在末尾。

export PATH=/usr/local/git/bin:/usr/local/bin:$PATH

6
为了使路径编辑后的值在下一个会话中保留,请执行以下操作:
cd ~/
touch .bash_profile
open .bash_profile

那将会打开编辑器中的.bash_profile文件,在里面添加你想要添加到路径中的内容,并使用冒号分隔每个值。
export PATH=$PATH:/usr/local/git/bin:/usr/local/bin:

保存,退出,重启终端并享受使用吧。


2
你需要在右侧添加$PATH,否则你将失去对所有Linux命令的访问。 - Hisham Ahamad
@HishamAfzalAhamed 我已经添加了。谢谢。 - Daniel Raouf

4

我也遇到了同样的问题。

进入 ../etc/ 目录, 然后使用 ls 命令确保你的 "paths" 文件在其中, 用 vim 命令打开 paths 文件,在文件末尾添加 "/usr/local/bin"。


2
我倾向于认为这很整洁。
sudo mkdir -p /etc/paths.d   # was optional in my case
echo /usr/local/git/bin  | sudo tee /etc/paths.d/mypath1

https://scriptingosx.com/2017/05/where-paths-come-from/ - alfwatt

2

在MAC OS Catalina中,这是我成功的步骤,所有上述解决方案都有所帮助,但没有解决我的问题。

  1. 检查node --version,仍然使用旧版本。
  2. cd ~/
  3. atom .bash_profile
  4. 删除指向旧节点版本的$PATH,在我的情况下是/usr/local/bin/node/@node8
  5. 将以下内容添加并保存到$PATH中 "export PATH=$PATH:/usr/local/git/bin:/usr/local/bin"
  6. 关闭所有使用node的应用程序(终端、模拟器、浏览器expo等)
  7. 重新启动终端并检查node --version

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接