gcloud가 zsh 별칭을 설정합니다.

gcloud가 zsh 별칭을 설정합니다.

gcloud에 대한 일부 별칭 명령어와 기능을 설정하려고 합니다. 다음 함수를 작성하고 Mac의 zsh에서 실행했습니다. 별도의 매개변수로 전달하면 c제대로 i작동하지만 전달하면 정상적으로 작동합니다 ci. 하지만 아래 번역을 보면 똑같습니다.

gcp() {
    local -A translation=(
        [c]=compute
        [i]=instances        
        [ci]="compute instances"
    )
    stg="stg-proj-12911"
    tst="tst-proj-1797"
    prd="prd-proj-817"
    
 
    local -a args
    for arg in "$@"; do
        if [[ -v "translation[$arg]" ]]; then
            args+=("${translation[$arg]}")
        elif [[ -v ${arg} ]]; then
           echo "project $arg has been set"
           #args+="--project=eval echo \$$arg"
           args+="--project=${(e)arg:+\$$arg}"
            #statements
        else
            echo "$arg"
            args+=("$arg")
        fi
    done
    echo  "${args[@]}"
    gcloud "${args[@]}"
}

gcp ci list stg매개변수로 전달하면 다음과 같은 오류가 발생하지만 정상적으로 작동합니다.gcp c i list stg

ERROR: (gcloud) Invalid choice: 'compute instances'.
Maybe you meant:
  gcloud compute instances

어쩌면 두 개가 아닌 compute instances단일 인수로 전달되기 때문일까요 ?gcloud

답변1

${translation[ci]}는 단어(정확히 하나의 공백 문자 포함)이지만 명령에는 및 별도의 인수가 gcloud필요합니다 . 단어 목록을 저장하는 가장 좋은 방법은 배열로 저장하는 것이지만, 한 배열을 다른 배열 안에 넣을 수는 없습니다(일반 배열이든 연관 배열이든). 따라서 계속해서 단일 문자열로 저장하되 확장할 때 공백에서 별도의 단어로 분할하세요. (종료하려는 매개변수에 표시되지 않는 한 구분 기호를 선택할 수 있지만 공백은 직관적이고 사용하기 쉽습니다.)computeinstances${translation[ci]}${translation[$arg]}

변화

args+=("${translation[$arg]}")

도착하다

args+=($=translation[$arg])

=매개변수 이름 앞의 기호매개변수 확장문자열을 공백의 별도 단어로 분할하도록 zsh에 지시합니다. (더 정확하게는 단어 구분 기호는 의 값으로 지정되지만 IFS스크립트에서 변경하지 않는 한 IFS걱정할 필요가 없습니다 .)

관련 정보