zsh 명령 행에서 모든 별명 해결 명령을 실행하기 전에 모든 별칭을 확인하고 싶습니다.

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

어떤 키에 바인딩되지 않은 기능이 있다면 M-x foobar나에게도 좋습니다. 심지어 외부 명령을 사용할 수 있습니다 ( type, command, which, 무엇이든). 스레드에서 모든 것을 시도했습니다 왜 “which”를 사용하지 않습니까? 그렇다면 무엇을 사용해야합니까? 그러나 아무것도 작동하지 않습니다.



답변

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

I를 누르면 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

현재 명령 행이 구문 상 유효한 경우에만 별칭을 확장하므로 구문 검사기로 두 배가됩니다.

bash의 MCE 와 달리 별칭도 완전히 확인합니다. 예를 들어 다음과 같은 경우 :

$ 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


답변

함수 정의에 명령 행을 채우고 함수를 인쇄하면 별명이 확장됩니다. 또한 정규화 된 공백이 생깁니다.

% 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있지만 별칭이 확장되는 위치를 파악하는 것은 쉘 구문과 밀접하게 연결되어 있기 때문에 다소 어렵습니다.


답변

중첩 된 고급 별칭이 많고 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


답변