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