macOS 上如何寫自定義命令行工具?
大家好,我是前端西瓜哥,今天來說說怎么在 macOS 上寫自定義命令行工具。
蘋果的 masOS 系統(tǒng)的底層核心是 Darwin 系統(tǒng)。Darwin 是類 Unix 系統(tǒng),所以我們可以在 masOS 上,像 Linux 一樣,執(zhí)行命令行工具。
我們通常通過第三方安裝的命令行工具,比如 node、npm、nginx 等,這很方便。
但,有時候我們想運行自己編寫的命令行工具,怎么做呢?
在這之前,我們先了解一些比較基本的惡概念
Shell
對于類 Unix 系統(tǒng),它有一個 shell 的概念。
Shell 是命令行的輸入界面,用戶可以在上面輸入命令去執(zhí)行任務(wù)。因為它是操作系統(tǒng)底層的一層封裝,因此得名為 Shell(殼)。
Shell 本身也是腳本語言,在能運行一些命令行工具的同時,也能進行一些判斷、循環(huán)之類的邏輯。
Shell 有各種實現(xiàn),比如最常用的 Bash,它是 Linux 和舊版本的 macOS 的默認(rèn)版本。
目前 macOS 默認(rèn)的 Shell 換成了 zsh。zsh 配置比較復(fù)雜,我推薦安裝 Oh My Zsh,會讓你的 zsh 更好用。
腳本保存位置
Shell 怎么知道可以執(zhí)行的命令行工具,也就是腳本的放在哪里呢?
答案是它會找全局變量 PATH 指定的目錄,找到匹配的文件去執(zhí)行。
我們執(zhí)行 echo $PATH 就能看到有哪些目錄:
$ echo $PATH
/Users/watermelon/.nvm/versions/node/v18.8.0/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin
目錄是有多個的,用冒號分隔。會按順序查詢每個目錄下的文件,直到找到一個同名的執(zhí)行它,然后結(jié)束。
如果你想要知道某個命令的位置,可以使用 which 命令:
$ which node
/Users/watermelon/.nvm/versions/node/v18.8.0/bin/node
現(xiàn)在我們想寫自己的自定義腳本,那么就需要找到一個目錄放這些腳本。
我的做法是在用戶家目錄下創(chuàng)建一個 bin 目錄,也就是路徑位置 ~/bin。
mkdir ~/bin
然后給 PATH 變量新增一個路徑,我們需要在 ~/.zshrc 文件加上:
export PATH=~/bin:$PATH
這樣,每次打開終端時,PATH 路徑都會執(zhí)行 .zshrc 文件,然后給 PATH 變量加上 ~/bin 路徑。
自定義腳本
然后我們就可以在 bin 目錄下寫自己的腳本。
你可以寫名為 hello 的 sh 腳本:
#!/bin/sh
echo Hello!
也可以寫一個名為 hi 的 nodejs 腳本:
#!/usr/bin/env node
console.log('Hi!')
我們通過第一行帶有 #! (稱為 shebang)的注釋來指定編譯器。然后下面的幾行就是對應(yīng)語言的腳本。
然后記得給這些腳本的屬性設(shè)置為可執(zhí)行,否則會報權(quán)限否認(rèn)的錯誤。
chmod u+x hello
chmod u+x hi
看看效果:
下面就可以根據(jù)自己需要做寫一些腳本了。
想要在 VS Code 下集成的終端打開獨立的 iterm2 窗口,我們的一個方式是:
open . -a iTerm .
很長,我們可以寫一個名為 iterm 的腳本:
open . -a iTerm ${1:-.}
${1:-.} 代表取第一個參數(shù),如果沒有,就實用默認(rèn)值 .。另外把第一行的注釋也省略掉了,默認(rèn)會作為 shell 腳本執(zhí)行。
這樣我執(zhí)行 iterm 就能打開獨立 iterm2 窗口。
或者你可以用 github 做一些文章備份,我寫了一個 artcle-push 腳本:
cd ~/Documents/articles
git add .
arg1=${1:-update}
git commit -m $arg1
git push
該腳本可以某個目錄的文件進行 commit,然后提交到 Github,且支持指定 commit 信息。
當(dāng)你寫了新的內(nèi)容,想備份的時候,輸入 artcle-push 就可以了,非常方便。
結(jié)尾
想要提高效率嗎?那你需要做自動化或半自動化,把一些重復(fù)的工作交給計算機,趕緊來寫你的自定義腳本吧。