Command
我可以擴展添加我自己的別名的命令嗎?
我創建了一些別名來處理
nodejs
項目,例如:alias lsc="cat package.json | jq '.scripts'"
列出文件
scripts
部分中的所有可用命令package.json
理想情況下,我想將其作為
npm scripts
或npm something
但npm
在我的路徑中現有的可執行程序執行。是否可以擴展它以添加我自己的別名?
免責聲明:我對Node.js或
npm
.使用覆蓋
npm
命令的 shell 函式:npm () { if [ "$1" = scripts ]; then jq '.scripts' package.json else command npm "$@" fi }
這個 shell 函式檢測函式的第一個參數是否是字元串
scripts
。如果是,它會執行您的jq
命令。如果不是,它npm
使用原始命令行參數呼叫真正的命令。該
command
實用程序確保不呼叫該函式(否則將創建無限遞歸)。上面的程式碼可以放在你定義普通別名的任何地方。
如果
npm
已經是一個 shell 函式,這將無法做正確的事情。將此擴展到許多新的子命令,
if
程式碼會很混亂。反而:then``elif
npm () { case $1 in scripts) jq '.scripts' package.json ;; hummus) hummus-command ;; cinnamon) spice-command ;; baubles) stuff ;; *) command npm "$@" esac }
這將創建呼叫其他命令的 、 和
scripts
子hummus
命令。如果函式的第一個參數與任何自定義子命令都不匹配,則像以前一樣呼叫真正的命令。cinnamon``baubles``npm
請注意,為現有 子命令添加替代
npm
項將覆蓋該子命令npm
。如果你想從你自己的替代子命令中呼叫那個真正command npm "$@"
的子命令,呼叫(假設你沒有呼叫shift
來轉移子命令名稱,在這種情況下你想呼叫command npm sub-command "$@"
)。每個新的子命令都可以訪問函式的命令行參數,但您可能希望
shift
將子命令的名稱從列表中刪除:npm () { case $1 in scripts) jq '.scripts' package.json ;; hummus) shift echo '"npm hummus" was called with these additional arguments:' printf '%s\n' "$@" ;; *) command npm "$@" esac }
最後一個函式執行的範例:
$ npm hummus "hello world" {1..3} "npm hummus" was called with these additional arguments: hello world 1 2 3