Linux

在單個命令中使用多個別名

  • December 22, 2020

我在Mac bash Terminal. 我在我的.bash_profile文件中設置了別名以下

alias gc=gcloud
alias cmp=compute
alias ins=instances
alias pdev="--project=devproj-12891"
function listgce(){
   gcloud compute instances list --project "$1"
}

所有這些都可以作為別名單獨使用並且可以使用,但是當我嘗試在單個命令上使用其中的多個時,bash 僅計算為第一個。例子 :

~ % gc cmp ins list pdev
ERROR: (gcloud) Invalid choice: 'cmp'.
Maybe you meant:
 gcloud compute instances

如果我在這方面做錯了什麼,可以請人指導我嗎?

這在 bash 中是可能的:如果別名定義的最後一個字元是空格(或製表符),那麼 bash 也會取消下一個單詞的別名:

$ alias foo="echo "
$ alias bar="hello "
$ alias baz=world
$ foo bar baz
hello world

參考:6.6手冊中的別名。

因此,您可以將別名連結在一起:但第一個單詞必須是別名。


不過我不會使用別名:它非常微妙而且可能很脆弱。我會使用一個函式,比如

gc() {
   local -A translation=(
       [cmp]=compute
       [ins]=instances
       [pdev]="--project=devproj-12891"
   )
   local -a args
   for arg in "$@"; do
       if [[ -v "translation[$arg]" ]]; then
           args+=("${translation[$arg]}")
       else
           args+=("$arg")
       fi
   done
   echo gcloud "${args[@]}"
}

然後

$ gc cmp ins list pdev
gcloud compute instances list --project=devproj-12891

echo如果它看起來不錯,請刪除。


更新地址快捷方式“ci”,添加 2 個單詞“compute”“instances”:

這是一種特殊情況,因為我們不想在 args 中添加一個單引號項,而是添加兩個。讓我重寫該函式以獲得更大的可擴展性:

gc() {
   local -a args
   for arg in "$@"; do
       case $arg in
           cmp)  args+=( compute ) ;;
           ins)  args+=( instances ) ;;
           ci)   args+=( compute instances ) ;;
           pdev) args+=( "--project=devproj-12891" );;
           *)    args+=( "$arg" ) ;;
       esac
   done
   echo gcloud "${args[@]}"
}

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