Linux
在單個命令中使用多個別名
我在
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[@]}" }