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
使用指令
, 看列印出來的字元串是否含有i字元. 如果有,代表interactive(互動式shell)echo $-
-
區分是否登入shell
使用指令ps 檢視目前shell程序(zsh,bash等)前是否有-辨別.如果有-, 則表示是login-shell.
當我們用iTerm2打開zsh時, 使用ps指令檢視程序名, 可以看到程序名是-zsh, 是以我們在mac上用iTerm2預設打開的是login-shell.
zsh啟動時執行的檔案順序
- 首先從
讀取, 不可以覆寫這個檔案/etc/zshenv
- (忽略)接下來的行為可以被RCS 和 GLOBAL_RCS 選項修改. RCS選項影響所有的啟動檔案. GLOBAL_RCS選項隻影響全局啟動檔案(這裡指的是路徑以/開頭的檔案). 如果其中一個選項沒有設定, 所有接下來的檔案都不會被讀取. 一個以
路徑開頭的檔案去重新設定生效GLOBAL_RCS也是可以的. RCS和GLOBAL_RCS 都擁有一個預設設定$ZDOTDIR
- 接下來會從
讀取指令. 如果目前是一個login-shell, 接下來會從$ZDOTDIR/.zshenv
讀取指令, 然後是/etc/zprofile
.$ZDOTDIR/.zprofile
- 如果目前shell是一個互動式shell, 接下來會從
然後是/etc/zshrc
. 最後, 如果目前shell是登入shell,$ZDOTDIR/.zshrc
和/etc/zlogin
會加載$ZDOTDIR/.zlogin
- 如果
變量沒設定, 預設使用HOME變量.$ZDOTDIR
- 根據安裝方案的不同, 上面說的/etc中的目錄也可能在其他目錄
- 因為每個zsh的執行個體都會加載
,是以這個檔案應該盡可能的小.用一個if判斷把那些并不需要每個shell都執行的語句包起來是一個好主意./etc/zshenv
-
當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
- 添加環境變量
$ echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(jenv init -)"' >> ~/.zshrc
-
使用jenv add将java加入管理
5.使用jenv管理java版本
- 配置全局Java版本
$ jenv global
配置目前目錄的Java版本
$ jenv local
這種方式會隻改變目前所在目錄的Java版本,可以通過如下指令取消
$ jenv local --unset
配置shell執行個體的版本
jenv shell
這種配置方式,隻會影響目前shell視窗。
配置JVM Options
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
- 首先使用homebrew安裝pyenv
brew install pyenv
-
配置pyenv的環境變量
在.zshrc末尾添加
eval “$(pyenv init -)”
- 使用pyenv安裝其他版本python
pyenv install --lsit //檢視可以安裝的各個版本的python
pyenv install . // 安裝某個具體版本的python
重新開機iTerm2後, which python會發現pyenv安裝的python存放于~/.pyenv/… 中.
tips: 如果使用brew安裝python, python會被存放于/Library/Frameworks/Python.framework/Versions/x.x中
pyenv切換python版本
pyenv global . // 将全局python設定為版本
pyenv local . // 将目前目錄的python版本設定為版本
建議将全局的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檔案中記錄的版本号.(全局的)