一文理解Mac环境配置问题

5,706 阅读2分钟

前言

作为开发者,每当新安装某个软件,很容易会遇到电脑环境变量配置相关的问题,大部分情况只要按照软件的readme文档进行配置即可,如果有什么问题就google或者百度一下,但是作为开发者怎么能允许这么高频且可能长时间伴随我们的东西是一个黑盒呢!如果你对这块内容一知半解,本文会从比较基本的指令说起不妨花几分钟阅读一下本文。

常用命令

MacOS

MacOS本身是基于 Unix内核 的图形化操作系统,而 linux 是大佬Linus为了人们用到免费的类unix系统而开发,所以本质上macOSLinux是同根同源的(可以理解为chrome和edge都是用chromium内核但是在外面套的壳不一样)。
所以两者大部分特性和命令都是相通的。同时mac开发环境认自带ruby、php、python2、bash等环境(以前还自带java,后来貌似某个版本给去掉了)。

先来了解一下文件操作最基础常用的指令

命令功能举例
cd前往某目录cd ~/Desktop
ls显示当前目录的内容ls
ls -la详细显示当前目录内容(包含权限及隐藏文件)ls -la
pwd显示当前路径pwd
cat查看某文件内容cat ./file.txt
vim使用vim编辑某文件内容vim ./file.txt
touch创建或修改文件touch ./test.txt
rm删除文件rm ./file.txt
rm -rf删除文件夹内容rm -rf ./dir
mkdir创建文件夹mkdir dir
rmdir删除文件夹rmdir ./dir
mv移动或修改文件名mv file0.txt file1.txt
mvdir移动或修改文件名mvdir dir0 dir1
man查看指令man sudo
sudo系统管理者的身份执行指令sudo vi /private/etc/hosts

常用操作指令

我们通过几种不同的安装 Homebrew 的方式来分析我们在安装不同软件时常用的一些指令

通过ruby安装

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

先来看这条指令分两块分别是

通过bash或者sh安装

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
  • Bourne shell (sh)
    UNIX 最初使用,且在每种 UNIX 上都可以使用。 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。(mac上用的的sh命令并不是这个,千万别弄混)
  • bash(Bourne-Again Shell)
    Linux/MacOs 操作系统缺省的 shell。
    是 Bourne shell 的扩展,与 Bourne shell 完全向后兼容。
    在Bourne shell 的基础上增加、增强了很多特性。
    可以提供如命令补全、命令编辑和命令历史表等功能。
    有灵活和强大的编程接口,同时又有很友好的用户界面。
    而mac中无论是sh 还是 bash 指的都是 bash shbash的区别,实际上是bash有没开启POSIX模式的区别 简单说,sh是bash的一种特殊的模式,sh就是开启了POSIX标准的bash, sh 相当于 /bin/bash --posix

常用配置

软件配置

接下来说一下我们通常使用的软件配置,绝大部分软件的配置都是存放在根目录的,只是因为在mac中以 . 为前缀做为隐藏文件存在。我们通过下面的指令看一下

ls -la ~

我们对一些软件的配置修改本质上其实就是改这里面的文件,用git的配置作为例子(我先将.gitconfig删除了)
正常我们开始配置配置都会输入username 和 email

git config --global user.name 'yourname'
git config --global user.name 'youremail'

正常我们想用使用git还要生成ssh秘钥

ssh-keygen -t rsa -C 'youreamail'

那这个ssh就生成在了.ssh中 id_rsa.pub 就是你的公钥,id_rsa就是你的私钥,将公钥粘贴到指定的位置即可了。(私钥不要轻易泄露,想深入了解的可以看一下非对称加密的原理)

正常来说你的绝大部分软件配置都是~/.xx文件或文件夹,所以配置遇到问题不要慌,直接找到配置文件看一下。
而通常配置一般分为3个等级,一般执行的权重按照 本地配置>用户配置>系统配置。还是用git举例刚才的命令中我用了--global代表的就是用户配置。下面是三种配置级别

git config --system --list // 查看系统config

git config --global  --list // 查看当前用户(global)配置:

git config --local  --list // 查看当前仓库配置信息

--global 的情况已经说过了,--local 的话大家在git项目中通常都有一个.git文件 --local就是查看里面的配置信息,最后system我们执行一下,告诉我没有找到系统的配置文件,因为我没有配置过,所以不会有默认的。

但是我们可以看到路径上有一个/etc/ 通常很多系统级的配置文件会存在里面,有时候大家看到一些解决办法的时候往/etc/ 路径中修改或增加配置信息要注意点,本身权重很低里面的配置也很容易被global基本的配置覆盖。

(如果你想将配置保存起来快速的用到其他电脑,只要找到对应的配置文件保存起来,替换到其他电脑即可)

环境配置

在mac环境下默认都会用到以下的几个配置
系统级别,对系统所有用户都生效

/etc/profile
/etc/paths
  • /etc/profile 第一个加载
    涉及系统的环境,即环境变量相关。这里修改会对所有用户起作用,最先启动的就是这个命令,当然也是权重最低的,有时候遇到配置问题按照网上的修改这个文件却不生效可能就是权重不够。(没事不要改这个文件,终端的配置尽量放在一个地方

  • /etc/paths 第二个加载
    全局环境变量配置文件,本身没有什么语法,一行为一条不接受注释之类的,没啥事也别改。

用户级别

~/.bash_profile  // ~/.bash_profile -> ~/.bash_login -> ~/.profile -> ~/.bashrc
~/.zshrc  // 这个并不是系统自带的而是oh-my-zsh自带的

先来说.bash_profile,正常在mac下读完系统的变量之后就会读取.bash_profile,如果找到了.bash_profile也就不会读后面三个文件了(linux系统有所不同)。所以,有时候解决某些配置问题时,可能人家给的答案并不是针对mac系统,遇到配置问题需要修改配置,在mac系统下老老实实的用.bash_profile配置就好了

再来说一下 .zshrc,这个并不是系统自带的,我们通常使用终端本质上是使用一个sh环境,系统自带的有时候不好用我们通常都会自己装一个,最常见的就是oh-my-zsh,之前提到了系统自带的sh环境是bash,那么装了oh-my-zsh之后我们启动的自然就是zsh,所以装了oh-my-zsh的用户启动的自然就是~/.zshrc也就不会读取~/.bash_profile文件了,不过一般我们通常都会在./zshrc文件的最后加一句source ~/.bash_profile来读一遍bash的配置。

有的同学可能会遇到这样的问题,安装了某软件配置了环境变量在~/.bash_profile 中可是每次启动终端都要执行一次source命令还不知道为什么,如果你安装了zsh那么你要在.zshrc中添加 source ~/.bash_profile就好了。如果我说的你能理解,那么配置方面的大部分问题应该都能搞定了

最后说一下语法问题
本身这些配置文件都是遵守shell语法的,如果懒得看,我这边把我的.zshrc配置本身的注释去掉,给你解读一下。


# shell中export为导出变量的意思 下面中 $ZSH 就是使用这个变量
# 同时我们可以在命令行 通过echo $XXX 来查看export过的信息
export ZSH=$HOME/.oh-my-zsh

# 主题设置
ZSH_THEME="ys"

# 插件使用
plugins=(git npm osx web-search zsh-syntax-highlighting sudo wd history last-working-dir)

# 执行一下oh-my-zsh的配置
source $ZSH/oh-my-zsh.sh

# 命令别名,可以在命令行通过定义好的命令 执行命令串 比如我再命令行使用pwc 就可以复制当前地址
alias pwc="pwd | pbcopy; pwd"
alias p="projj find"

# 方法也是可以定义命令 可以直接调用方法名 执行里面的命令
cdtmp() {
   cd $(mktemp -d $HOME/Tmp/${1:-xu}-XXXX);
}

mkdir() {
 command mkdir -p "$@" && eval cd "\"\$$#\"";
}


# 环境变量设置 shell export 出去的名称会被记住,比如CLASS_PATH就可能被外面的某个地方调用
# 而环境变量的拼接一般就是export PATH = "$PATH:XXX"

export PATH="~/.bin:$PATH"

export JAVA_HOME="/Library/Java/JavaVirtualMachines/openjdk-12.0.1.jdk/Contents/Home"
export CLASS_PATH="$JAVA_HOME/lib"
export PATH="$PATH:$JAVA_HOME/bin"


export NVM_DIR="$HOME/.nvm"
export PATH="$NVM_DIR/versions/node/v10.16.0/bin:$PATH"

nvm(){
   unfunction "nvm"
   [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"   # This loads nvm
   [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_↷

   nvm "$@"
}

source $HOME/.bash_profile

结束语

本身这种环境配置并不复杂,只是人会懒得考虑能用就行,但是作为开发者这个可以必备技能,如果我写的有错误的地方,或者我写的不清楚导致您有疑问的地方,欢迎评论区讨论,如果对您有帮助希望您点个赞支持一下哈。