별칭을 사용하여 zsh에서 여러 단어 명령을 재정의하는 방법은 무엇입니까?

별칭을 사용하여 zsh에서 여러 단어 명령을 재정의하는 방법은 무엇입니까?

나는 docker ps초월하려고 노력한다docker ps --format="table {{.ID}} {{.Image}} {{.Status}}"

나는 읽었다이 문제및 참조 문서가 있지만 제대로 작동하지 않습니다.

나는 몇 가지 "컴파일" 접근 방식을 시도했는데 이것이 최신 시도입니다.

alias func='dockerps'

function dockerps() {
 'docker ps'='docker ps --format="table {{.ID}} {{.Image}} {{.Status}}"'$\
}

docker ps입력할 때 서식이 유지 되도록 코드를 수정하려면 어떻게 해야 합니까 ?

답변1

여러 단어로 구성된 별칭 같은 것은 없습니다. 당신이 언급한 SO 답변은 나에게 완전히 잘못된 것 같습니다. 그것은 말이 되지 않으며 zsh 역사 4.3을 파고들 때에도 원하는 효과에 가까운 것을 생성하는 함수의 흔적을 찾을 수 없습니다(zsh An 개발 버전에 있었을 수 있는 실험적 기능)은 5.0 릴리스 이전에 제거되었습니다. 작성한 내용은 잘 정의된 의미를 갖습니다. 별칭 func과 이라는 함수를 정의하므로 dockerps첫 번째 단어가 또는 인 명령줄에서만 작동합니다. 함수가 호출되면 잘못된 이름으로 변수를 설정하려고 시도하지만 실패합니다.funcdockerps

Zsh를 사용하면 특수 문자가 포함된 단어에 대한 별칭을 정의할 수 있습니다.

darkstar% alias "'docker ps'"='echo docker ps in single quotes'
darkstar% alias 'docker\ ps'='echo docker backslash ps'                 
darkstar% 'docker ps'
docker ps in single quotes
darkstar% docker\ ps
docker backslash ps
darkstar% "docker ps"
zsh: command not found: docker ps

하지만 특별히 유용하지는 않습니다. 'docker ps'한 단어가 아니라 docker ps두 단어입니다.

일반적인 방법으로 수행해야 합니다. 즉 docker, 라는 함수를 정의하고 해당 인수를 분석하도록 합니다. 이는 전역 옵션을 지원하는 간단한 버전이지만 매개변수가 있는 전역 옵션 --option=value대신 사용해야 합니다 --option value.

docker () {
  setopt local_options extended_glob unset
  local -i i=$argv[(i)^-*]
  # $argv[i] is the first non-option argument (or empty if there is none).
  # See if we want to insert something after it.
  case $argv[i] in
    ps) argv[i+1,i]=(--format="table {{.ID}} {{.Image}} {{.Status}}");;
  esac
  command docker "$@"
}

답변2

기술적으로는 버그 기능이 어디서 나오는지와 같이 csh다음 alias과 같이 할 수 있습니다.

alias docker='docker '
alias     ps='ps --format="table {{.ID}} {{.Image}} {{.Status}}"'

이렇게 하면 원하는 결과를 얻을 수 있지만 이는 다음을 의미합니다.

  1. 뒤에 나오는 모든 단어는 docker별칭 확장의 영향을 받습니다. (이 트릭은 명령 을 인수로 취하는 와 같은 명령 alias cmd='cmd '에 적용되므로 별칭도 그 뒤에 확장됩니다.)commandenvsudo
  2. ps앞에 없는 단어도 확장됩니다 . 즉 , 호출 문구를 변경하지 않는 한 더 이상 독립 실행형 명령을 실행할 docker수 없습니다 (예 : ).ps"ps" -ef

여기서는 새로운 것을 정의합니다.주문하다원하는 작업을 수행하는 원래 이름과 충돌하지 않도록 다른 이름을 사용하십시오.

my-docker-ps() docker ps --format="table {{.ID}} {{.Image}} {{.Status}}" "$@"

이는 함수로 구현되지만 셸 외부에서도 사용할 수 있도록 스크립트로 구현하는 것이 더 나을 수도 있습니다.

관련 정보