MAC使用注意事項

MAC使用注意事項

16年的學生生涯這個月徹底結束了, 在家休養了幾天之後. 我就很快趕到深圳入職了, 以後就從一個學生變成Tencenter啦. 公司竟然突然很壕的允許我們Android工程師也配置iMac. 雖然一直沒有用過,但是早就對mac用來寫代碼的便利性有所耳聞了, 所以我就毫不猶豫的在入職時選擇了imac作爲開發電腦.
第一次使用mac,有一些需要注意的點這裏做一下記錄.

iTerm2 + zsh + oh-my-zshs

mac和unix是一家親, 命令行非常方便, 這也是mac非常大的一個優點. 但是mac自帶的終端比較簡單, 功能不多, 所以這裏我們換用”MAC下最好用的終端工具”— iTerm2.
這裏記錄幾個概念

終端

如果我們不用GUI界面登錄linux, 那麼進入的那個黑乎乎的界面就是所謂的終端了. mac也是同理, 只不過我們每次一打開mac就自動進入了GUI界面. 在GUI界面需要像終端那樣和系統交互, 就需要終端模擬器這個軟件. mac系統自帶的terminal軟件就是一個終端模擬器. 但是最這個軟件的功能比較簡陋, 所以我們選用iTerm2這個軟件. iTerm2具體好在哪裏這裏就不在贅述了, 下載iTerm2的時候會有介紹.

shell

這個概念是比較容易和終端混淆的一個概念. 簡單的理解就是終端模擬器只是一個殼, 裏面包裹了shell. shell是命令行解釋器, 是我們和內核打交道的橋樑. shell有很多種, 負責把我們我們在命令行輸入的命令解釋執行. 大部分shell的命令的格式都是差不多的. OS X系統和大部分的linux系統默認安裝的shell都是bash. 可以使用命令查看自己當前的mac系統有哪些shell

cat /etc/shells

zsh

OS X系統一般自帶了zsh這個shell. 使用命令

chsh -s /bin/zsh

就可以成功的從bash切換到zsh了.
zsh一般被公認爲最強的shell. 但是由於其配置過於繁瑣, 所以導致很多人看到它就打退堂鼓. 於是GitHub上有人寫了一個開源項目oh-my-zsh, 只要安裝了這個開源項目, 就可以一鍵配置zsh shell. 具體安裝方法一搜一大把,這裏忽略.

環境變量及各文件執行順序

作爲程序員, 肯定是需要配置各種環境變量的了. 在windows上配置環境變量是比較簡單的, 可以直接在gui界面完成. 也可以在CMD窗口使用SET命令完成.
mac系統中一般使用export命令將本地變量輸出爲環境變量,使用$變量名取環境變量的值.

幾種shell的區別

  • 交互式shell
    交互式模式就是在終端上執行,shell等待你的輸入,並且立即執行你提交的命令。這種模式被稱作交互式
  • 非交互式shell
    shell不與你進行交互,而是讀取存放在文件中的命令,並且執行它們。當它讀到文件的結尾EOF,shell也就終止了
  • 登錄shelll
    是需要用戶名、密碼登錄後才能進入的shell(或者通過”–login”選項生成的shell)
  • 非登錄shell
    當然就不需要輸入用戶名和密碼即可打開的Shell
  • 區分交互式shell和非交互式shell
    使用命令echo $- , 看打印出來的字符串是否含有i字符. 如果有,代表interactive(交互式shell)
  • 區分是否登錄shell
    使用命令ps 查看當前shell進程(zsh,bash等)前是否有-標識.如果有-, 則表示是login-shell.
    當我們用iTerm2打開zsh時, 使用ps命令查看進程名, 可以看到進程名是-zsh, 所以我們在mac上用iTerm2默認打開的是login-shell.

zsh啓動時執行的文件順序

  • 首先從/etc/zshenv讀取, 不可以覆蓋這個文件
  • (忽略)接下來的行爲可以被RCS 和 GLOBAL_RCS 選項修改. RCS選項影響所有的啓動文件. GLOBAL_RCS選項隻影響全局啓動文件(這裏指的是路徑以/開頭的文件). 如果其中一個選項沒有設置, 所有接下來的文件都不會被讀取. 一個以$ZDOTDIR路徑開頭的文件去重新設置生效GLOBAL_RCS也是可以的. RCS和GLOBAL_RCS 都擁有一個默認設置
  • 接下來會從$ZDOTDIR/.zshenv讀取命令. 如果當前是一個login-shell, 接下來會從/etc/zprofile讀取命令, 然後是$ZDOTDIR/.zprofile.
  • 如果當前shell是一個交互式shell, 接下來會從/etc/zshrc然後是$ZDOTDIR/.zshrc. 最後, 如果當前shell是登錄shell, /etc/zlogin$ZDOTDIR/.zlogin會加載
  • 如果$ZDOTDIR變量沒設置, 默認使用HOME變量.
  • 根據安裝方案的不同, 上面說的/etc中的目錄也可能在其他目錄
  • 因爲每個zsh的實例都會加載/etc/zshenv,所以這個文件應該儘可能的小.用一個if判斷把那些並不需要每個shell都執行的語句包起來是一個好主意.
  • 當zsh被sh或者ksh調起的時候, 會source /etc/profile 和 ~/.profile.
    更加詳細額相關信息, 可以參考stackoverflow相關回答
    以及man zsh.PATH變量的設置可以參考Mac OS X 中 Zsh 下 PATH 環境變量的正確設置

homebrew

homebrew是一個包管理器, 類似於Ubuntu的apt-get, 用來安裝mac沒有預裝但是日常開發中需要的東西.
homebrew會把軟件安裝在獨立的目錄, 並建立一個軟連接到/usr/local. 下面介紹一個homebre使用的各個目錄.
* Cellar:文件夾存放的是所有包安裝所在路徑,包括二進制,文檔和配置文件,按照這樣Cellar/包名/版本號/的形式來安放。
* opt:由於版本號隨着跟新而改變的,所以需要一個固定不變的路徑作爲我們訪問二進制和文檔的路徑,這就是opt的作用。
* Homebrew:brew程序所在路徑.
* bin:所有包安裝之後二進制都會鏈接到這個路徑下
* share:所有包安裝之後的文檔都會鏈接到這個路徑下
* etc:同上,所有包的配置文件
* lib:同上,所有包相關庫文件
* Caskroom:app文件

java多版本

我的工作項目的編譯需要的java版本要求 > 8. 但是日常使用的工具, 如pycharm,intelij要求使用java8. 平時需要體驗最新的一些特性,也需要使用最新的java8.所以我們需要在mac上保持多個jdk版本共存.
1. 首先使用brew cask安裝java8 和 java6

brew cask install java6
brew cask install java

brew cask中已經移除了java7, oracle官網也顯示不再提供java7的下載. 所以想裝上java7現在還是需要費一點功夫的.
2. 使用brew安裝jenv

brew install jenv
  1. 添加環境變量
$ echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(jenv init -)"' >> ~/.zshrc
  1. 使用jenv add將java加入管理
    5.使用jenv管理java版本
    • 配置全局Java版本
$ jenv global 1.7

配置當前目錄的Java版本

$ jenv local 1.7

這種方式會只改變當前所在目錄的Java版本,可以通過如下命令取消

$ jenv local --unset

配置shell實例的版本

jenv shell 1.8

這種配置方式,只會影響當前shell窗口。
配置JVM Options

$ jenv global-options "-Xmx512m"

python多版本共存

python多版本共存的問題比較特殊, 因爲系統本來就自帶一個python.

系統自帶python

當我們沒有安裝任何版本的python時, 直接打python命令你會發現也可以進入一個python命令行.
這個python在哪裏呢. 我們使用which python命令, 會發現這個python的路徑在/usr/bin/python. 看了一些其他的資料說這個python是個鏈接, 鏈接到/System/Library/Frameworks/Python.framework/Versions/2.7/python2.7. 實測後發現並不是, 這個python既不是硬鏈接也不是軟鏈接, 與python2.7比較文件大小後發現也不一樣, 所以這個python就是一個普通的可執行文件.
不過進入這個/usr/bin/python之後,輸出sys.path發現這個python的包地址都在/System/Library/Frameworks/Python.framework/Versions/2.7這個路徑裏面. 所以這兩個路徑還是有一些關聯的.
(這裏比較迷惑, 如果有錯漏, 歡迎拍磚指出)

使用pyenv安裝pyenv

  1. 首先使用homebrew安裝pyenv
brew install pyenv
  1. 配置pyenv的環境變量
    在.zshrc末尾添加
eval “$(pyenv init -)”
  1. 使用pyenv安裝其他版本python
pyenv install --lsit    //查看可以安裝的各個版本的python
pyenv install 3.6.1      // 安裝某個具體版本的python

重啓iTerm2後, which python會發現pyenv安裝的python存放於~/.pyenv/… 中.

tips: 如果使用brew安裝python, python會被存放於/Library/Frameworks/Python.framework/Versions/x.x中

pyenv切換python版本

pyenv global 2.7.1  // 將全局python設置爲2.7版本
pyenv local 3.6.1 // 將當前目錄的python版本設置爲3.6版本

建議將全局的python版本設置爲2.7.1, 保持與自帶的python版本一致. 保證系統其他需要默認python的位置正常運行.

pyenv原理

在.zshrc文件末尾添加的

eval “$(pyenv init -)”

會在打開shell時執行, 這段代碼在PATH的最前端插入了python的path. 這個pthon不是真正的python程序, 它只是一個轉發器, 當執行到這個python時, 它會按順序查找對應版本的python分發給對應程序.
分發的順序依次是:
* PYENV_VERSION環境變量的版本(當前shell)
* 當前目錄的.python-version文件中記錄的版本號.如果當前目錄找不到, 會遞歸的向上找, 所以父目錄設置了版本號會影響子目錄.(當前目錄及其父目錄)
* pyenv安裝目錄中的version文件中記錄的版本號.(全局的)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章