macOS 上如何寫自定義命令行工具?

前端西瓜哥 發佈 2022-09-30T20:36:53.264024+00:00

下面就可以根據自己需要做寫一些腳本了。想要在 VS Code 下集成的終端打開獨立的 iterm2 窗口,我們的一個方式是:很長,我們可以寫一個名為 iterm 的腳本:${1:-.} 代表取第一個參數,如果沒有,就實用默認值 .。

大家好,我是前端西瓜哥,今天來說說怎麼在 macOS 上寫自定義命令行工具。

蘋果的 masOS 系統的底層核心是 Darwin 系統。Darwin 是類 Unix 系統,所以我們可以在 masOS 上,像 Linux 一樣,執行命令行工具。

我們通常通過第三方安裝的命令行工具,比如 node、npm、nginx 等,這很方便。

但,有時候我們想運行自己編寫的命令行工具,怎麼做呢?

在這之前,我們先了解一些比較基本的惡概念

shell

對於類 Unix 系統,它有一個 Shell 的概念。

Shell 是命令行的輸入界面,用戶可以在上面輸入命令去執行任務。因為它是作業系統底層的一層封裝,因此得名為 Shell(殼)。

Shell 本身也是腳本語言,在能運行一些命令行工具的同時,也能進行一些判斷、循環之類的邏輯。

Shell 有各種實現,比如最常用的 Bash,它是 Linux 和舊版本的 macOS 的默認版本。

目前 macOS 默認的 Shell 換成了 zsh。zsh 配置比較複雜,我推薦安裝 Oh My Zsh,會讓你的 zsh 更好用。

腳本保存位置

Shell 怎麼知道可以執行的命令行工具,也就是腳本的放在哪裡呢?

答案是它會找全局變量 PATH 指定的目錄,找到匹配的文件去執行。

我們執行 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

目錄是有多個的,用冒號分隔。會按順序查詢每個目錄下的文件,直到找到一個同名的執行它,然後結束。

如果你想要知道某個命令的位置,可以使用 which 命令:

$ which node
/Users/watermelon/.nvm/versions/node/v18.8.0/bin/node

現在我們想寫自己的自定義腳本,那麼就需要找到一個目錄放這些腳本。

我的做法是在用戶家目錄下創建一個 bin 目錄,也就是路徑位置 ~/bin

# 創建 bin 目錄
mkdir ~/bin

然後給 PATH 變量新增一個路徑,我們需要在 ~/.zshrc 文件加上:

export PATH=~/bin:$PATH

這樣,每次打開終端時,PATH 路徑都會執行 .zshrc 文件,然後給 PATH 變量加上 ~/bin 路徑。

自定義腳本

然後我們就可以在 bin 目錄下寫自己的腳本。

你可以寫名為 hello 的 sh 腳本:

#!/bin/sh
echo Hello!

也可以寫一個名為 hi 的 nodejs 腳本:

#!/usr/bin/env node
console.log('Hi!')

我們通過第一行帶有 #! (稱為 shebang)的注釋來指定編譯器。然後下面的幾行就是對應語言的腳本。

然後記得給這些腳本的屬性設置為可執行,否則會報權限否認的錯誤。

chmod u+x hello
chmod u+x hi

看看效果:

下面就可以根據自己需要做寫一些腳本了。

想要在 VS Code 下集成的終端打開獨立的 iterm2 窗口,我們的一個方式是:

open . -a iterm .

很長,我們可以寫一個名為 iterm 的腳本:

open . -a iTerm ${1:-.}

${1:-.} 代表取第一個參數,如果沒有,就實用默認值 .。另外把第一行的注釋也省略掉了,默認會作為 shell 腳本執行。

這樣我執行 iterm 就能打開獨立 iterm2 窗口

或者你可以用 Github 做一些文章備份,我寫了一個 artcle-push 腳本:

cd ~/Documents/articles
git add .
arg1=${1:-update}
git commit -m $arg1
git push

該腳本可以某個目錄的文件進行 commit,然後提交到 Github,且支持指定 commit 信息。

當你寫了新的內容,想備份的時候,輸入 artcle-push 就可以了,非常方便。

結尾

想要提高效率嗎?那你需要做自動化或半自動化,把一些重複的工作交給計算機,趕緊來寫你的自定義腳本吧。

我是前端西瓜哥,歡迎關注我,學習更多前端知識。

關鍵字: