在单个命令中使用多个别名

Lea*_*ner 1 linux bash terminal google-cloud macos

我在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"
}
Run Code Online (Sandbox Code Playgroud)

所有这些都可以单独作为别名使用,但是当我尝试在单个命令上使用其中多个时,bash 只计算第一个。例子 :

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

如果我在这方面做错了什么,可以请有人指导我吗?

gle*_*man 5

这在 bash 中是可能的:如果别名定义的最后一个字符是空格(或制表符),那么 bash 也会取消下一个单词的别名

$ alias foo="echo "
$ alias bar="hello "
$ alias baz=world
$ foo bar baz
hello world
Run Code Online (Sandbox Code Playgroud)

参考:手册中的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[@]}"
}
Run Code Online (Sandbox Code Playgroud)

然后

$ gc cmp ins list pdev
gcloud compute instances list --project=devproj-12891
Run Code Online (Sandbox Code Playgroud)

echo如果看起来不错,请将其删除。


更新地址快捷方式“ci”,添加 2 个单词“compute”“instances”:

这是一种特殊情况,因为我们不想向参数添加一个单引号项,而是两个。让我重写该函数以获得更大的可扩展性:

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[@]}"
}
Run Code Online (Sandbox Code Playgroud)