Lesson1:从HomeBrew开始

前言:回头是岸的程序员

 首先介绍一下我电脑的基本情况。我当年买的是2017款的Mbp,目前操作系统更新到macOS Monterey 12.0.1,Intel i5处理器,8G内存,256G硬盘。


我的Mbp基本情况

 作为我人生中唯一的苹果本,我还记得当初,买这台笔记本时的雄心壮志。据说:“用不好Win的人,是怪系统垃圾;但用不好Mac的人,只能怪自己笨”。虽然这台笔记本陪伴着我完成了大大小小四、五个项目,前前后后装过的软件、插件也不下100个,但说实话,时至今日,我依然觉得我并没有把Mac用的很好。当然,我也坚决不会承认自己是一个笨蛋~
 作为一个有点强迫症和洁癖的人,我其实并不是很能接受每次因为各种原因卸载掉软件包后留下的“一地鸡毛”。特别是,在之后的某一天,当我因为各种原因,不得不去查看操作系统里某个包的版本时,看到的一堆乱七八糟的版本号,着实让人很不爽。但考虑到项目的时间和自己的头发,也只能一边随手百度一篇解决方案,一边安慰自己:环境问题,能跑就好。但其实只有我知道,我那台“高贵”的深空灰Mbp里装了多少垃圾,每次安装新包前,都要先在心里默默祈祷一遍一切顺利。
 所有的改变开始于,我不再从事开发工作之后。彻底脱离写代码之后的第一件事,就是我花了大概一个晚上的时间把之前装过的各种和开发相关的软件逐一卸载、删除(除了JDK),当然使用的方法也是我随手百度到的一篇教程(事后证明:这种乱拳打死老师傅的方法并不靠谱,非常容易引发后期各种依赖混乱的问题)。但至少在当时的我看来,这种方法在一定程度上缓解了我的心理洁癖,让我对重新把Mac用好这件事,恢复了信心。要是能重来,我一定要好好管理我的各种软件包,and it's time now!

Part1:Homebrew从放弃到入门

 说起homebrew,相信每一个使用macOS的开发者都或多或少听说过。但我想大部分人对于homebrew的了解,也仅限于知道这是一个基于git的包管理神器,很多复杂软件包都可以直接通过一行简单的“brew install”轻松完成。但就像“天下没有免费的午餐”一样,对于菜鸟程序员来说,再好用的工具在使用的时候也可能会遇到各种意想不到的问题。比如,当年为了安装TensorFlow,

Part2: Homebrew的安装和国内换源

 由于某些众所周知的原因,Homebrew官方的安装方法在国内并不完全适用。好在天无绝人之路,虽然但是,我们还是可以通过换源大法,享受便捷的Homebrew管理。
 官网安装命令:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

2.1 先运行脚本试试

 既然无论如何,我们都需要通过官方网址获取Homebrew的安装脚本,那就直接执行吧,看看会得到什么样的结果!

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

 命令行返回的结果如下:

==> Checking for `sudo` access (which may request your password)...
Password:
==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew
/usr/local/etc/bash_completion.d/brew
/usr/local/Homebrew

Press RETURN/ENTER to continue or any other key to abort:
==> /usr/bin/sudo /usr/sbin/chown -R luna:admin /usr/local/Homebrew
==> Downloading and installing Homebrew...
remote: Enumerating objects: 970, done.
remote: Counting objects: 100% (707/707), done.
remote: Compressing objects: 100% (46/46), done.
remote: Total 970 (delta 669), reused 690 (delta 657), pack-reused 263
Receiving objects: 100% (970/970), 487.44 KiB | 1.05 MiB/s, done.
Resolving deltas: 100% (730/730), completed with 140 local objects.
From https://github.com/Homebrew/brew
 + 064a1956f9...6096bc6d71 master     -> origin/master  (forced update)
 * [new branch]            dependabot/bundler/Library/Homebrew/addressable-2.8.1 -> origin/dependabot/bundler/Library/Homebrew/addressable-2.8.1
 * [new branch]            dependabot/bundler/Library/Homebrew/spoom-1.1.12 -> origin/dependabot/bundler/Library/Homebrew/spoom-1.1.12
Updating files: 100% (6994/6994), done.
HEAD is now at 6096bc6d71 Merge pull request #13716 from carlocab/cleanup-cleanup_path
fatal: unable to access 'https://github.com/Homebrew/homebrew-cask/': LibreSSL SSL_connect: Operation timed out in connection to github.com:443 
fatal: unable to access 'https://github.com/Homebrew/brew/': LibreSSL SSL_connect: Operation timed out in connection to github.com:443 
Error: Fetching /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask failed!
Fetching /usr/local/Homebrew failed!
Updated 2 taps (homebrew/core and caskroom/cask).
Failed during: /usr/local/bin/brew update --force --quiet

 可以看到,脚本在安装brewhomebrew-cask的时候因为网络不通失败了。解决方法是执行如下命令,创建你本地的Homebrew目录。

git clone git://mirrors.ustc.edu.cn/homebrew-core.git/ /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/ --depth=1

2.2 设置Git远程地址

 接下来,我们只需要对本地的Homebrew仓库定时更新,并通过各种brew install命令安装我们所需要的软件包即可。为此,我们需要将其远程版本库设置为国内可以直接获得的网络地址,具体操作如下:
1.将core、cask软件的下载地址设置为国内地址;

cd "$(brew --repo)"
git remote set-url origin https://mirrors.ustc.edu.cn/brew.git
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
cd "$(brew --repo)"/Library/Taps/caskroom/homebrew-cask
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git

2.设置bottle源的下载地址为国内地址。

echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bash_profile
source ~/.bash_profile

 至此,我们的Homebrew就完全配置好了,我们可以通过brew update来验证Homebrew是否能正常运行,确认无误后,让我们再用brew config检查一下Homebrew的当前的配置情况。

HOMEBREW_VERSION: 3.5.9-135-g6096bc6
ORIGIN: https://mirrors.ustc.edu.cn/brew.git
HEAD: 6096bc6d71bfb42f285a12414d3aee7fcee1ed75
Last commit: 24 hours ago
Core tap ORIGIN: https://github.com/Homebrew/homebrew-core
Core tap HEAD: 10b8920cc93bf9ef0681aa5cac97b9e30301d04d
Core tap last commit: 2 hours ago
Core tap branch: master
HOMEBREW_PREFIX: /usr/local
HOMEBREW_BOTTLE_DOMAIN: https://mirrors.ustc.edu.cn/homebrew-bottles
HOMEBREW_CASK_OPTS: []
HOMEBREW_EDITOR: subl -w
HOMEBREW_MAKE_JOBS: 4
Homebrew Ruby: 2.6.8 => /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby
CPU: quad-core 64-bit kabylake
Clang: 13.1.6 build 1316
Git: 2.32.1 => /Library/Developer/CommandLineTools/usr/bin/git
Curl: 7.77.0 => /usr/bin/curl
macOS: 12.0.1-x86_64
CLT: 13.4.0.0.1.1651278267
Xcode: N/A

Part3: Homebrew的常用语法及含义

 有了Homebrew,接下来让我们一起来看一下Homebrew的常用操作命令吧。

操作 命令
更新Homebrew brew update
更新所有安装过的软件包 brew upgrade
更新指定的软件包 brew upgrade python
查找软件包 brew search python
安装软件包 brew install python
卸载软件包 brew remove python
列出已安装的软件包 brew list
列出可更新的软件包 brew outdated
查看软件包的信息 brew info python
查看软件包的依赖信息 brew deps python
查看或编辑Formula脚本 brew edit python@3.6
清理系统中所有软件的历史版本 brew cleanup
清理系统中指定软件的历史版本 brew cleanup [软件名]
检查Homebrew环境,并进行相应的修复 brew doctor
根据Formula脚本生成bottle文件 brew bottle python@3.6
安装带图形界面的软件 brew cask install [软件名]
添加其他的软件下载地址 brew tap [user/repo]

Part4:积土为山

 在本部分中,我将对配置和使用Homebrew过程中用到的一些好玩、高效的tricks做一些简单介绍,希望能够帮大家更好的去应用Homebrew。

4.1 将Homebrew的文本编辑器设置为Sublime Text

 虽然阿柒并不排斥直接在终端里使用vi编辑器修改文本,但比起千篇一律的文本行和只能上下左右移动的光标,我还是更喜欢Sublime Text里高亮的文本展示以及随心所欲的在触控板上移动光标的feel~于是,借着这次机会,我便对我终端的文本编辑器进行了一次统一的升级,以后再要编辑文本的时候,就都可以在ST(Sublime Text)中轻松完成啦!这里照搬国外某大神在SO论坛里的高赞回答,三步搞定!
1.首先,在你的终端里随便打开一个文件夹,并在此处尝试打开你的ST;

 /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl .

 注意:此步至关重要!如果你的ST无法在当前指定的文件夹中打开,那么相应的,后面的步骤也将无法生效。你可以依照你的ST在Applications文件夹中的文件名,将命令行中的“Sublime\ Text.app”替换为“Sublime\ Text\ 2.app”或者“Sublime\ Text\ 3.app”。下图是阿柒的ST在电脑中的存储名:

阿柒的ST文件名

2.接下来,就是要在你的环境变量(PATH)中创建符号链接。不过在那之前,我们还需要通过编辑~/.bash_profile,保证subl在命令行中代表ST;

export PATH=/bin:/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH
export EDITOR='subl -w'

 其中,第一行设置了终端查找的环境变量路径的位置,鉴于最终阿柒的符号链接放在了“usr/local/bin”路径下。当然啦,只要能对应起来,其实你是可以把符号链接放在任何一个路径下的;第二行其实是可以省略的,写在这里的目的仅是为了将命令行文本编辑器默认设置为ST。-w是ST的配置参数之一,表示wait for the files to be closed before returning,即在我们主动关闭所编辑的文件之前,ST将一直保持打开状态,是最符合我们日常编辑操作的参数。更多参数可以参考Sublime Text DOC
3.最后就是创建ST的符号链接了~

ln -s /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl /usr/local/bin/subl

 现在,当你想要在命令行中使用ST编辑某个文件时,只需输入下面的命令即可。

subl [你想要编辑的文件名]

 特别的,当我们使用brew edit编辑查看某个安装公式时,同样的我们也可以使用类似的方法将编辑器替换成ST。即在~/.bash_profile中添加以下内容:

export HOMEBREW_EDITOR='subl -w'

4.2 当命令行报错:Permission denied

 举个例子,当我要用下面这段IP地址替换某段网址时,我的命令行是这样写的:

sudo echo "182.xx.124.6 raw.githubusercontent.com" >> /etc/hosts

 当然了,不出意外的获得了如下的结果:

-bash: /etc/hosts: Permission denied

 阿柒经过实践和查阅资料获知,出现Permission denied这种情况一般是由于两部分原因,即:1.用户权限不足;2.文件权限不足。
 于是用排除法即可解决问题——已知用户已获得超级用户(root)权限,系统仍然报错:Permission denied,那原因只可能是:/etc/hosts文件权限不足。因此我们可以使用下列语句对文件权限进行修改:

sudo chmod -R 777 /etc/hosts

 其中,chmod即change mode,修改文件权限。注意⚠️:只有文件的所有者和超级用户可以对权限进行修改,因此chmod前常与sudo配合使用。-R表示级联应用到目录中的所有子目录和文件,777表示所有用户都拥有最高权限。
 当然啦,同样的目标我们也可以通过下面的语句来实现:

sudo chmod a+w /etc/hosts

 这是因为,a表示所有用户组,包括root用户组、文件拥有者用户组和其他用户组。而“+”表示添加权限,“x”表示执行权限,“r”表示阅读权限,“w”表示写入权限。

4.3 详解环境变量

4.3.1 你真的知道环境变量吗?

4.3.2 $PATH中各路径顺序

4.3.3 alias与环境变量的关系

4.4 Mac终端的显示配置

Part5:只道寻常

一、千变万化命令行

二、-R级联是如何实现的

三、指定文件权限的两种模式:绝对模式(八进制数字模式)、符号模式分别是什么

四、文件的权限都包括什么,又是如何排序的

五、详解用户组

六、为什么需要符号链接

七、镜像源

 对于我们时常在项目搭建的过程中使用到的镜像源,不知道大家有没有好奇过它究竟是个什么东西😂,在此阿柒先将一个比较常见的镜像源镇上来,请大家一睹尊容💁
🔗USTC Mirror Help

八、MacOS的个人版设置推荐

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容