Homebrew:无法创建符号链接,/usr/local/bin不可写。

428

在安装tig时,HomeBrew在安装依赖项时显示以下问题:

Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/a2x
/usr/local/bin is not writable.

You can try again using:
  brew link asciidoc

3
这不属于stackoverflow.com,而是属于superuser.com或askdifferent.com。 - Ondra Žižka
15个回答

685

参考Alex的回答,我成功解决了这个问题。看起来这个问题并不特定于正在安装的软件包,而是涉及homebrew文件夹的权限。

sudo chown -R `whoami`:admin /usr/local/bin

对于某些软件包,您还需要对/usr/local/share/usr/local/opt执行此操作:

sudo chown -R `whoami`:admin /usr/local/share
sudo chown -R `whoami`:admin /usr/local/opt

30
将所有 /usr/local/bin 目录重新分配给当前用户会给系统或其他用户带来任何麻烦吗? - Don Giulio
11
sudo chown -R whoami:admin /usr/local/bin 能否代替回答中的命令,而不需要将 yourusername 替换为您的实际用户名? - Jason Swett
5
之后我还需要递归地更改usr/local/opt的所有权。这样就可以正常工作了。 - atripes
7
在我的 Mac(10.9.5)中,/usr/local/bin 文件夹的权限(以及相关文件夹)每天似乎会恢复为 drwxr-xr-x+root wheel。每次想要执行 brew install 时,我都必须重新配置这些权限。我猜测操作系统会重置权限以保护我?我该如何阻止这种情况发生?(我尝试过使用 chflags uchg...,但那样会阻止 brew 安装。) - Quinn Comendant
2
我将我的账户添加到了“wheel”组。这使得我可以使用“sudo chmod -R g+w /usr/local”命令,从而允许“wheel”组的成员对文件夹进行写操作。相比于将这些敏感文件夹的所有者更改为不如root账户安全的账户,这种方法似乎更加安全。 - Michael Krebs
显示剩余11条评论

264

建议执行brew doctor来检查问题,认真对待所有警告。您可能遇到的其他问题可能无法在此问题中捕获。

另外,随着时间的推移,brew可能会更新,特定的命令可能会失效或者不再适用。但是,brew doctor将确保您获得最新的故障排除。


9
我不敢相信你的回答得票率更低。它肯定比上面猜测的回答更明智。 - Robert of Fairfax
42
"brew doctor" 命令不能解决问题,只会告诉你问题的存在。当你按照检测结果修复问题后,Brew 可能会提示无法执行操作。这并不是一个解决方案。 - Keith Tyler
11
也许有人改进了它。现在Brew Doctor建议我运行一个类似于最流行答案的命令,之后Brew符号链接就可以工作了。我使用的是Mac,我们将看到它能持续多久。 :-) - Joshua Richardson
2
这非常有用,谢谢。修复了一些其他特殊目录,以便拥有上述建议遗漏的权限。 - SwimBikeRun
7
Brew doctor 提供了确切的问题,并提供了手动解决方案! - netrox
显示剩余2条评论

89

针对寻找/usr/local/sbin不可写错误的人:

更新:这可能是/usr/local/someOtherFolderName,例如/usr/local/include。你只需要用以下命令创建该文件夹:

  • sudo mkdir someOtherFolderName

首先创建sbin文件夹,注意这需要sudo权限

  • cd /usr/local

  • sudo mkdir sbin

  • sudo chown -R $(whoami) $(brew --prefix)/*

  • brew link yourPackageName


10
这对我有用。 - robin
1
我还需要将目录添加到我的~/.bash_profile文件中:PATH=$PATH:/usr/local/sbin - Julien
经过数小时的搜索,这是唯一对我有效的方法。我使用的是High Sierra操作系统。 - ItsJoeTurner
它对我也起作用了(OS X 11.2)。突然出现了GNU Fortran的问题...但现在一切都正常了。感谢这个提示。 - Harald

82
其他回答是正确的,至少在它们所涉及的范围内是正确的,但它们没有解释为什么可能会出现这个问题以及如何解决根本原因。
原因
这个问题有两个可能的原因:
1.安装 homebrew 的用户与您当前使用的用户不同。Homebrew 期望只有最初安装它的用户才会想要使用它。 2.您安装了一些软件,它们写到 /usr/local 而没有使用 brew。如果运行 brew doctor,这就是造成的原因。
解决方法
多用户 Homebrew
如果您有多个用户帐户,并且您希望其中一个以上的用户能够使用 brew,则需要执行一些步骤,否则每次切换用户时都必须更改 Homebrew 文件结构的所有权,这不是一个好主意。
详细说明可以在 网上 找到,但快速答案是:
  1. 创建名为brew的群组:

    1. 打开 系统偏好设置
    2. 点击 账户
    3. 点击 "+" (必要时先解除锁定)
    4. 新建帐户 下选择 群组
    5. 输入 brew
    6. 点击 创建群组
  2. 选择 brew 群组,并将要使用brew的用户帐户添加到其中。
  3. 更改 /usr/local 文件夹群组所有权:sudo chgrp -R brew /usr/local
  4. 更改权限以将写入权限添加到 /usr/local 作为群组:sudo chmod -R g+w /usr/local
  5. 更改 homebrew 缓存目录群组:sudo chgrp -R brew /Library/Caches/Homebrew
  6. 更改 homebrew 缓存目录权限:sudo chmod -R g+w /Library/Caches/Homebrew

单用户 Homebrew

如果你不需要使用多个Homebrew用户,那么其他答案给出的解决方案可能已经足够了,这些解决方案基于brew doctor的建议: sudo chown -R $(whoami) /usr/local sudo chown -R $(whoami) /Library/Caches/Homebrew 验证
完成这些步骤后,brew doctor应该可以报告成功,任何在brew组中的用户都可以使用,假设您已注销并重新登录以应用新的组成员身份(如果您选择了多用户路线)。如果您只是为单个用户的Homebrew更正了问题,则注销并重新登录不是必需的,因为您的任何组成员身份都没有更改。

2
谢谢!我应该多了解一下Unix用户组。我对它的工作原理完全不了解,需要好好消化一下。但是听起来非常合理,感谢指引! - Jikku Jose
1
Unix组比你想象的要简单-每个文件都有可供拥有该文件的“用户”和“组”,以及“其他人”的读取、写入和执行权限。如果您设置拥有文件或文件夹的组,并为该文件夹添加“组”的写入权限,则该组中的任何用户都可以写入该文件夹。实际上,就是这么简单。不像Windows中的权限那样复杂。 - stonecrusher
1
那么,将一组文件的权限系统整合到一个组中,以便可以轻松地添加多个用户并在单个操作中应用所有这些权限,这是一种简单的方法吗? - Jikku Jose
2
这解决了我的brew链接问题,谢谢。 - Keith Tyler
仍然让我感到有点危险,将 /usr/local/bin 这样的敏感目录设置为组可写,特别是在多用户环境中。这真的是“官方”的 brew 方式吗? - corwin.amber
显示剩余6条评论

39

针对我的特定设置,我发现以下命令有效

brew doctor

然后这向我展示了我的错误所在,接着是与上面评论略微不同的命令。

sudo chown -R $(whoami) /usr/local/opt

2
谢谢你的明显建议。我往往会忘记 brew doctor - Antony
1
这里的问题已经解决了。 - khaosdoctor
brew doctor 很好。 - AechoLiu
非常好用,谢谢。 - hexley

35

我发现了同样的问题,我们可以通过以下三个步骤来解决:

步骤1

sudo chown -R $(whoami) $(brew --prefix)/*

第二步

brew doctor

第三步

brew prune or brew cleanup

如果你仍然遇到任何链接问题,比如说mysql,只需写下:

brew link mysql

这将起作用。


1
对我来说,这个RabbitMQ可行。 - Omar
1
“Step 1”的目的是什么? - Conrad C
1
Brew doctor 很棒!没用 brew prune,但安装了其他缺少的包,mongodb 就能正常工作了。 - Chenlu
3
禁止使用 'brew prune' 命令,请使用 'brew cleanup' 命令代替。 - hanumanDev
1
对我有用。但我用的是 brew cleanup,就像 @hanumanDev 建议的那样。谢谢你们俩。 - developer01
对我来说很有效,谢谢。 - hassan tarif

13

我发现这对我有用(没有初始转储命令):https://github.com/Homebrew/brew/issues/3285#issuecomment-334976806 - vr_driver
谢谢!尝试了Harry的最佳答案,没有成功 - 尝试了这个,它像魔法一样奏效了! - Joe
对我有用,谢谢! - zen
对我不起作用。 - Raymond

9
对我来说,解决方案是运行brew update
所以,请先执行此操作。
这对于熟悉homebrew的人可能是正常的做法,但我不是其中之一。
编辑:我发现我需要通过运行brew doctor来更新,正如@kinnth在同一个问题的答案中建议的那样。
一般的故障排除流程可能如下: 1. 运行brew update 2. 如果这不起作用,请运行brew doctor并遵循其指示 3. 如果这也不起作用,请检查stack overflow。

1
这对我来说解决了所有问题,在做任何其他事情之前值得做。 - Rob Evans
所有brew doctor所做的就是指出我在我的存储库中有未链接的kegs...所以这对解决OP的问题没有任何帮助。 - AlxVallejo
@AlxVallejo 这是我解决一个问题时所做的,当时我收到了与 OP 几乎相同的错误信息。从 Brew Doctor 收到的消息对我来说似乎是一个不同的问题。 "1. 运行 brew update 2. 如果这没有帮助,请运行 brew doctor 并按照其指示操作 3. 如果这仍然无法解决,请检查 stack overflow" 的工作流程可能仍然适用。 - FragmentalStew

6

这是因为当前用户没有权限在该路径中进行写入操作。所以,要更改读写权限,您可以使用1.终端或2.图形的“获取信息”窗口。

1. 使用终端

搜索如何使用终端中的chmod/chown (更改模式/更改所有者)命令

2. 使用图形化的“获取信息”

您可以右键单击要更改权限的文件/文件夹,然后打开获取信息,它会显示如下所示的窗口,在窗口底部您可以轻松更改读写权限: enter image description here

请记得在您完成临时工作后将权限更改回“只读”


使用brew doctor命令 - 它会正确识别需要修复的(系统)文件夹。 - johndpope

6

在执行brew link node时,我同时遇到了以下问题:

Error: Could not symlink include/node/usr/local/include is not writable.

Linking /usr/local/Cellar/node/9.3.0... Error: Permission denied @ dir_s_mkdir - /usr/local/lib

为了解决上述问题,只需要前往/usr/local/目录,并检查文件夹'include''lib'是否存在。如果这些文件夹不存在,只需手动创建它们即可。
然后再次运行brew install node命令。

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