Command

我可以擴展添加我自己的別名的命令嗎?

  • November 21, 2019

我創建了一些別名來處理nodejs項目,例如:

alias lsc="cat package.json | jq '.scripts'"

列出文件scripts部分中的所有可用命令package.json

理想情況下,我想將其作為npm scriptsnpm somethingnpm在我的路徑中現有的可執行程序執行。

是否可以擴展它以添加我自己的別名?

免責聲明:我對Node.jsnpm.

使用覆蓋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
}

這將創建呼叫其他命令的 、 和scriptshummus命令。如果函式的第一個參數與任何自定義子命令都不匹配,則像以前一樣呼叫真正的命令。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

引用自:https://unix.stackexchange.com/questions/553205