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