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

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

我在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

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

答案1

这在 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”:

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

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[@]}"
}

相关内容