단일 명령에 여러 별칭 사용

단일 명령에 여러 별칭 사용

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"라는 두 단어를 추가합니다.

이는 매개변수에 작은따옴표 항목을 추가하는 것이 아니라 두 개를 추가하고 싶기 때문에 특별한 경우입니다. 확장성을 높이기 위해 이 함수를 다시 작성하겠습니다.

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

관련 정보