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」を更新し、「compute」と「instances」という2つの単語を追加します。
これは、パラメータに一重引用符エントリを追加するのではなく、2つを追加したいので、特別な場合です。スケーラビリティを高めるためにこの関数を書き直しましょう。
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[@]}"
}