光陰荏苒絮蒿,日月如梭僵朗。
如何把有限的時(shí)間和精力用在有意義的事情上是人類無法逃避的問題壤蚜。作為 macOS daily user转绷,高效用好 macOS 系統(tǒng)及其生態(tài)中的各種工具可以讓我們少浪費(fèi)一些生命在無意義的重復(fù)勞動(dòng)中。
關(guān)于 macOS 的效率工具網(wǎng)絡(luò)上已經(jīng)有非常多的文章可供參考戈毒,本系列不過總結(jié)一二艰猬,希望能對讀者有所幫助。
一埋市、Terminal, 終端, Shell
終端(computer terminal)是一個(gè)歷史遺留下來的名詞冠桃,早期的終端機(jī)大概長這樣。這個(gè)不是個(gè)人電腦道宅,只是一臺(tái)顯示器食听,接了一個(gè)鍵盤(DEC VT100)。背后有一臺(tái)巨大的主機(jī)污茵,對接很多臺(tái)終端樱报,這樣每個(gè)終端就是一個(gè)輸入輸出設(shè)備。
今天大家都在用個(gè)人電腦(PC)泞当,普通用戶基本不會(huì)遇到多終端共享同一個(gè)主機(jī)的情況迹蛤。但也并不是完全沒有終端,比如車站的刷卡機(jī)就是一臺(tái)終端機(jī)襟士。
所以現(xiàn)在各種類 Unix 系統(tǒng)——比如 Linux 的各種發(fā)行版盗飒,和基于 FreeBSD 的 macOS——都在 UI 層虛擬了一個(gè)終端。
當(dāng)你打開虛擬終端的時(shí)候陋桂,和古老的物理終端一樣逆趣,會(huì)運(yùn)行一個(gè)最基本的人機(jī)交互程序,稱為 Shell嗜历。
在 Shell 中輸入一行命令宣渗,它就解釋執(zhí)行這一行,然后顯示結(jié)果秸脱。另外 Shell 也支持批量處理命令落包,需要寫一個(gè) Shell 腳本,然后執(zhí)行它摊唇。歷史上有多種不同的 Shell:
-
sh
: Bourne Shell咐蝇,由 Steve Bourne 開發(fā),絕大多數(shù) UNIX 系統(tǒng)標(biāo)配 -
csh
: Bill Joy 開發(fā)巷查,BSD UNIX 系統(tǒng)標(biāo)配 -
ksh
: David Korn 開發(fā)有序,兼容sh
,并支持csh
的新功能 -
tcsh
: csh 的加強(qiáng)版 -
bash
: Bourne Again Shell岛请,GNU 開發(fā)的旭寿,基本上是所有 Linux 系統(tǒng)默認(rèn)的 shell 了
想要知道你的系統(tǒng)自帶了什么 shell,你可以在終端運(yùn)行:
cat /etc/shells
macOS 自帶的是這些:
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
二崇败、Oh My Zsh
除開 Windows 的 cmd.exe盅称,我最早接觸終端是在 Linux 系統(tǒng)上肩祥,當(dāng)時(shí)用的是 Ubuntu 桌面版。現(xiàn)在大多數(shù)人接觸 PC 都是從桌面版帶 GUI 的操作系統(tǒng)開始缩膝,所以相比之下命令行要顯得稍微難操作一點(diǎn)混狠。如果有讀者朋友覺得命令行操作起來相對困難的話,可以參考著名的《鳥哥的Linux私房菜》這本書疾层。作為入門讀物還是非常容易上手的将饺。
接下來我們假定讀者朋友們都已經(jīng)比較熟悉 Shell 操作了。目前多數(shù)類 Unix 系統(tǒng)的默認(rèn) Shell 都是 Bash
痛黎,它已經(jīng)足夠用了予弧,但是還不夠好用。
目前比較流行的 Shell 是 zsh
和 fish
湖饱。二者各有優(yōu)劣掖蛤,我個(gè)人使用的而是 zsh
。
ZSH 稱為 Z shell琉历,是基于 sh
(Bourne shell)的擴(kuò)展坠七,包括了 ksh
, Bash
和 tcsh
等多種 shell 的特性。今年 WWDC 2019 上蘋果亦宣布將用 zsh 取代 bash 稱為 macOS Catalina 的默認(rèn) shell旗笔。
zsh 的自動(dòng)拼寫糾錯(cuò)彪置,大小寫不敏感的自動(dòng)補(bǔ)全,自帶的 where
命令等都非常實(shí)用蝇恶。在 macOS 上用 Bash 試圖 cd down[Tab]
的人都應(yīng)該有所體會(huì)拳魁。
zsh 還支持各種插件和擴(kuò)展,開發(fā)者可以基于 zsh 實(shí)現(xiàn)各種酷炫的命令行體驗(yàn)撮弧。Oh My Zsh就是一個(gè)開源的項(xiàng)目潘懊,也是大多數(shù) zsh 用戶的選擇。
超過 1350+ 的貢獻(xiàn)者為這個(gè)項(xiàng)目貢獻(xiàn)了 250+ 的插件和 125+ 的主題贿衍。
安裝起來非常簡單授舟,通過 curl 或者按照官網(wǎng)指示安裝即可:
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
oh my zsh 自帶的 git 插件簡直是開發(fā)者的福音。
還有多款主題任君選擇: Themes · robbyrussell/oh-my-zsh Wiki
三贸辈、 autojump
在 shell 里進(jìn)行文件夾路徑變換我們用的是 cd
命令(change directory)释树。假如我們有一個(gè)層級比較深的路徑: ~/Documents/ADir/BDir/CDir/DDir
。一般我們需要
cd ~ #或者 cd
cd Documents
cd ADir
cd BDir
cd CDir
cd DDir
這還是我能記得這個(gè)路徑的前提下擎淤。一般情況下我只記得它大概在哪里奢啥,所以還得多次 ls
看看是不是在當(dāng)前目錄。
這時(shí)候你需要一個(gè)無論身處哪個(gè)路徑都可以輕松跳轉(zhuǎn)過去的 jump 操作嘴拢。
j DDir
這就是 autojump
干的事情桩盲。只要 j keyword
就可以到達(dá)關(guān)鍵詞所在的地方,都不需要記得完整的名字席吴。
autojump
會(huì)對你曾經(jīng)到達(dá)過的路徑做一個(gè)緩存赌结,然后自己計(jì)算一個(gè)優(yōu)先級捞蛋。如果有多個(gè)同名文件夾,它會(huì)優(yōu)先匹配最高優(yōu)先級的那個(gè)姑曙。如果你覺得這個(gè)優(yōu)先級不對襟交,你可以使用 j -i
或者 j -d
來增加/減少當(dāng)前目錄的權(quán)重。
oh my zsh 也提供一個(gè)類似效果的插件伤靠,叫做 z
。github 地址在這里: oh-my-zsh/plugins/z at master · robbyrussell/oh-my-zsh
oh my zsh 除了直接把當(dāng)前 git 倉庫的信息展示在終端之外啼染,還自帶許多方便的 git 命令的 aliases宴合,比如:
Alias | Command |
---|---|
gaa | git add --all |
ggp | git push origin $(current_branch) |
這些 git 命令我們每天都需要打無數(shù)次,能用 alias 還是非常方便省事的迹鹅。
完整的 aliases cheatsheet 可以參考這里: Cheatsheet · robbyrussell/oh-my-zsh Wiki
四卦洽、.bash_profile, .profile 和 .zshrc
如果我們不做任何修改,登錄 shell 之后的所有配置就是默認(rèn)的斜棚。但是我們通常都需要安裝各種工具阀蒂,這些工具需要前置配置,比如環(huán)境變量 PATH
弟蚀。這些東西都保存在 .profile
文件里蚤霞。類 Unix 系統(tǒng)在登錄 shell 的時(shí)候一般都會(huì)讀取 .profile
文件。
如果你在自己的 Home 目錄(~) ls -a
一下一般可以看到這幾個(gè)文件:
.profile
.bash_profile
# 如果裝了 zsh 的話
.zshrc
這幾個(gè)文件的作用是類似的义钉,但是讀取順序不同昧绣,其中 .zshrc
只會(huì)被 zsh 讀取。關(guān)于這幾個(gè)配置文件的順序大家感興趣的可以參考這里: .bash_profile vs .bashrc - Abhinav korpal - Medium
一般情況下我會(huì)在 Dropbox 里放一個(gè) .bash_profile
文件捶闸,然后在多臺(tái) Mac 之間共享這個(gè)文件夜畴,只需使用 ln -s
在 Home 目錄創(chuàng)建一個(gè)軟鏈。
.bash_profile -> /Users/xxx/Dropbox/bash_profile
這個(gè)文件里面我們可以配置 shell 的 locale 信息删壮,比如:
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
或者是 Go 的配置:
# Go
export GOPATH=$HOME
export GOPATH=$HOME/go
export GOBIN=$HOME/go/bin
或者是一些常用的但是比較長的命令的 alias:
alias jcs="codesign -dvvv --entitlements :-"
甚至可以寫一個(gè) shell 函數(shù)進(jìn)來:
unproxy() {
unset http_proxy
unset https_proxy
echo "Proxy Unset."
}
這些寫進(jìn) .profile
文件的東西在登錄后贪绘,在任意路徑下直接使用。把常用命令放進(jìn)來是一個(gè)不錯(cuò)的選擇央碟。
通常情況下修改完 .profile
之后我們都需要 source
一下讓它生效:
source ~/.profile
那么 source 命令和直接執(zhí)行它有什么區(qū)別呢税灌?感興趣的讀者朋友可以看看這一篇文章:Linux下source命令詳解 - 在努力! - CSDN博客
簡單來說就是使用 sh filename
與 ./filename
來執(zhí)行腳本的時(shí)候硬耍,shell 本身會(huì)創(chuàng)建一個(gè)子 shell 來執(zhí)行這個(gè)腳本垄琐。所以在子 shell 里的變量并不會(huì)影響到當(dāng)前的這個(gè)父 shell。而 source
執(zhí)行的時(shí)候经柴,并不會(huì)創(chuàng)建子 shell 而是直接就在當(dāng)前 shell 執(zhí)行了狸窘,所以這里面什么 export
, alias
之類的東西就直接在當(dāng)前 shell 生效了。
五坯认、iTerm2
macOS 自帶的 Terminal.app 已經(jīng)足夠好用翻擒,雖然默認(rèn)是白色底的氓涣,字體也比較小,但是你可以在 Preferences 里面修改 Profiles 和字體陋气。在 macOS Mojave 以上你還可以使用 Dark Mode 來讓它變成黑色的劳吠。
不過還有比他更好用的終端 App — iTerm2。
iTerm2 有很多非常實(shí)用的 Feature巩趁,我最常用的有幾個(gè):
-
自定義外觀和 Profile
iTerm2 可自定義的外觀項(xiàng)比 Terminal 的多痒玩,而且還挺酷炫的。最近更新的版本還可以在頂部加入 Status Bar 顯示 CPU/Mem 以及當(dāng)前路徑的信息议慰。雖然我不怎么用但是可以看到 iTerm2 的進(jìn)化速度比 Terminal 快多了蠢古。一旦習(xí)慣了 iTerm2 的 UI 就回不去了。
-
實(shí)用的分屏功能
Terminal 雖然也自帶分屏和 Tab别凹,但是 iTerm2 可以通過
cmd+d
和cmd+w
來新建/關(guān)閉當(dāng)前分屏草讶,通過cmd+[
和cmd+]
來左右切換分屏。當(dāng)我需要多任務(wù)操作的時(shí)候非常有用炉菲。比如我在左邊看著本地的目錄堕战,右邊通過 ssh 登錄服務(wù)器對著服務(wù)器的目錄,兩邊做數(shù)據(jù)交換拍霜。 -
隨時(shí)用全局快捷鍵呼出的 Hotkey Window
在 Preferences 里面選擇 Keys -> HotKey -> Create a Dedicated Hotkey Window… 之后可以創(chuàng)建一個(gè)專門對應(yīng)全局快捷鍵的終端窗口嘱丢。按下自定義快捷鍵之后就會(huì) slide in。雖然我自己用的不多但這是 iTerm2 挺受歡迎的一個(gè)特性沉御。
-
實(shí)用的小細(xì)節(jié)
- 可以按住
cmd
使用鼠標(biāo)打開鏈接 - Tab 頂部會(huì)顯示當(dāng)前的任務(wù)和狀態(tài)
- 分屏的時(shí)候會(huì)讓不活動(dòng)的屏幕變淺色
- 可以按住
iTerm2 還有許多有用的小細(xì)節(jié)屿讽,在日常使用的時(shí)候不會(huì)覺得有什么了不起,但是當(dāng)你到別人的機(jī)器上用什么都沒改過的 Terminal 的時(shí)候忽然就發(fā)現(xiàn):我擦吠裆,怎么這么難用伐谈?這就是好的設(shè)計(jì)應(yīng)該有的感覺。
六试疙、快捷鍵
大部分終端 App 都會(huì)支持一些非常實(shí)用的快捷鍵操作诵棵。我們無論使用哪一個(gè) App,只要是經(jīng)常用的 App祝旷,經(jīng)常用的動(dòng)作履澳,都應(yīng)該學(xué)習(xí)使用快捷鍵。
在終端中我比較常用的幾個(gè)快捷鍵有:
Key | Action |
---|---|
alt+left | 往左跳一個(gè)單詞 |
alt+right | 往右跳一個(gè)單詞 |
ctrl+w | 向左刪掉一個(gè)單詞 |
ctrl+u | 刪掉一整行 |
ctrl+l | clear 整個(gè)終端的輸出 |
cmd+enter | iTerm2 的全屏/取消全屏快捷鍵 |
不同的終端 App 設(shè)置的快捷鍵可能不一樣但都大同小異怀跛,完整的 iTerm2 Cheat Sheet 在這里大家可以參考一下: iTerm2 Cheat Sheet - Kapeli
有一個(gè)叫做 CheatSheet 的 App 可以長按 ? 來查看當(dāng)前 App 的所有快捷鍵距贷,不過體驗(yàn)并不是很好。一般我會(huì)選擇 Google: App + Cheat Sheet 來獲得該 App 的 Cheat Sheet 列表吻谋。
比如 Tower 就整理了一份不錯(cuò)的 Xcode Cheat Sheet 在這里: Xcode Cheat Sheet忠蝗。對于 iOS 開發(fā)者來說,每天面對 Xcode 的時(shí)間賊多漓拾,不掌握點(diǎn)快捷鍵怎么可以呢阁最?
七戒祠、參考資料
- Shell的歷史
- Apple replaces bash with zsh as the default shell in macOS Catalina - The Verge
- Linux下source命令詳解 - 在努力! - CSDN博客