単一のコマンドで複数のエイリアスを使用する

単一のコマンドで複数のエイリアスを使用する

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

おすすめ記事