zsh 명령줄에서 모든 별칭을 확인하세요.

zsh 명령줄에서 모든 별칭을 확인하세요.

중첩된 별칭이 있고 명령을 실행하기 전에 모든 별칭을 확인하고 싶습니다. 어떻게 해야 하나요?

어떤 키에도 바인딩되지 않은 기능이 있다면 M-x foobar저도 괜찮습니다. 외부 명령(,,, 등)도 사용할 수 있습니다 type. 스레드에 있는 모든 것을 시도했습니다.commandwhich" which "를 사용하지 않는 이유는 무엇입니까? 그러면 무엇을 사용해야 합니까?그러나 아무것도 작동하지 않습니다.

답변1

Ctrl-Alt-E는 bash단지 별칭을 확장하는 것이 아닙니다. 또한 변수, 명령 대체(!), 프로세스 대체(!), 산술 확장 및 따옴표 제거(파일 이름 생성(와일드카드) 또는 물결표 확장을 수행하지 않음)을 확장합니다.

별칭을 확장하는 것이 항상 가능한 것은 아닙니다. 따라서 용도가 있지만 그 결과로 인해 명령줄의 의미가 변경되고 부작용이 있으며 잠재적으로 위험할 수 있다는 점을 인식하는 것이 중요합니다.

예를 들어:

$ a=';w' b=1
$ alias foo=bar
$ b=2; echo $b $a; cd /tmp/dir && for i do foo $(pwd) <(ls); done

여기를 클릭하면 M-C-E다음과 같은 내용이 나옵니다.

$ b=2; echo 1 ;w; cd /tmp/dir && for i do foo / /dev/fd/63; done

rm -rf *이것은 완전히 다른 명령줄을 제공하며(위의 명령줄을 대신 사용하면 어떻게 될지 상상해 보십시오 ) 별칭을 pwd확장하지 않습니다 .foo

를 사용하여 zsh함수 내부에서 확장된 별칭에 대한 Gilles의 설명을 바탕으로 다음을 수행할 수 있습니다.

expand-aliases() {
  unset 'functions[_expand-aliases]'
  functions[_expand-aliases]=$BUFFER
  (($+functions[_expand-aliases])) &&
    BUFFER=${functions[_expand-aliases]#$'\t'} &&
    CURSOR=$#BUFFER
}

zle -N expand-aliases
bindkey '\e^E' expand-aliases

별칭은 현재 명령줄이 구문적으로 유효한 경우에만 확장됩니다(따라서 구문 검사기 역할도 합니다).

MCE 와 달리 bash별칭도 완전히 해결합니다. 예를 들어 다음과 같은 경우가 있습니다.

$ alias ll='ls -l'; alias ls='ls --color'
$ ll

다음으로 확장됩니다.

$ ls --color -l

또한 구문을 정규화합니다. 예를 들면 다음과 같습니다.

$ for i (*) cmd $i; foo

로 변경:

$ for i in *
        do
                cmd $i
        done
        foo

답변2

명령줄을 함수 정의에 넣은 다음 함수를 인쇄하면 별칭이 확장됩니다. 표준화된 공백도 얻을 수 있습니다.

% alias foo='bar -1'
% alias bar='qux -2'
% f () foo -3
% which f
f () {
        qux -2 -1 -3
}

이 모든 것을 대화형 명령에 넣으려면 zle 위젯을 만들 수 있습니다. 함수 항목에 코드를 채워 함수를 직접 정의할 수 있습니다.functions다시 읽어보면 정규화된 효과를 얻을 수 있습니다.

normalize-command-line () {
  functions[__normalize_command_line_tmp]=$BUFFER
  BUFFER=${${functions[__normalize_command_line_tmp]#$'\t'}//$'\n\t'/$'\n'}
  ((CURSOR == 0 || CURSOR = #BUFFER)
  unset 'functions[__normalize_command_line_tmp]'
}
zle -N normalize-command-line
bindkey … normalize-command-line

동일한 정규화 효과를 얻습니다.preexec. 별칭은 함수가 자동 로드될 때도 확장됩니다( autoload -U종종 별칭 확장을 피하기 위해 사용됨).

이것_expand_alias커서 아래에 있는 단어가 별칭인 경우 완성 기능은 해당 단어를 확장합니다. 그것은 사용한다aliases대량으로. 재귀적이지 않습니다. 보다 일반적인 목적을 구현하는 별칭 확장기를 사용할 수 있지만 aliases별칭 확장 위치를 ​​결정하는 것이 셸 구문과 밀접하게 연결되어 있기 때문에 이는 다소 어렵습니다.

답변3

중첩된 멋진 별칭이 많고 zsh가 실제로 해당 별칭으로 무엇을 하는지, 그리고 옵션이 명령에 전달되는 순서가 확실하지 않은 경우 언제든지 -x옵션을 사용하여 zsh를 시작할 수 있습니다. 실행될 때 명령과 인수가 인쇄됩니다.

하지만 이 옵션은 디버깅 목적으로 만들어졌으므로 zsh -x호출 후에 쓸모없는 내용(기본적으로 .zshrc의 모든 함수/위젯/플러그인)이 많이 인쇄되며 명령 실행 중에도 매우 짜증날 수 있습니다. , 특히 정의 preexec하고 precmd연결한 경우에는 더욱 그렇습니다.

나는 또한 그것이 인쇄된다는 것을 언급해야합니다오직최종 실행된 명령과 개별 명령은 별도로 인쇄되므로 이후에는

alias a='echo a'
alias b='echo b'
alias c='echo c'
alias d='echo d'
a && b || c; d

너는 보게 될 것이다

+zsh:1> echo a
a
+zsh:1> echo b
b
+zsh:1> echo d
d

관련 정보