zsh: 쉘 제어 문자를 포함하여 명령줄만 반향하는 별칭 또는 쉘 함수

zsh: 쉘 제어 문자를 포함하여 명령줄만 반향하는 별칭 또는 쉘 함수

을 사용하여 zsh다음을 수행하는 별칭이나 셸 함수를 만들고 싶습니다.

<이 별칭 또는 셸 함수가 또는 >또는 &또는 또는 $또는 "기타와 같은 셸 제어 문자를 따르지 않고 명령줄을 에코하도록 하고 싶습니다 .

즉, 제안된 별칭 또는 셸 함수의 이름으로 "xxx"를 사용하는 다음 예를 고려해 보세요.

xxx ls -Flastr "${something}" >/tmp/xyz &

>and &$and {and }and 및 "이러한 특수 문자를 존중하지 않고 실행하지 않고 다음을 단순히 에코합니다 .

ls -Flastr "${something}" >/tmp/xyz &

"xxx" 뒤에 명령줄의 나머지 부분을 인용하고 특정 문자를 이스케이프하면 이 작업을 수행할 수 있다는 것을 알고 있지만 추가로 인용하거나 이스케이프하지 않고 이를 달성할 수 있는 방법을 찾고 있습니다.

또한 전체 스크립트가 아닌 이 별칭이나 셸 함수를 통해 호출된 한 줄에 대해서만 작동하기를 원합니다.

이것이 가능한가 zsh?

미리 감사드립니다.

답변1

이를 수행하는 한 가지 방법은 로 끝나는 별칭을 작성하고 #나머지 줄을 주석으로 만든 다음 기록에서 해당 줄을 추출하는 것입니다. 댓글을 활성화하는 데 필요합니다 setopt interactive_comments. 그러나 인쇄를 시작할 위치를 아는 것은 어려울 수 있습니다. 이 간단한 버전은 전체 줄을 인쇄합니다.

function xxx_function { print -lr -- ${history[$HISTCMD]}; }
alias xxx='xxx_function #'

답변2

이것은 Stéphane Chazelas가 제안한 변형이며 나에게 효과적이었습니다. 아래 Stéphane Chazelas의 의견을 바탕으로 원래 "답변"을 수정했습니다.

set -o interactive_comments -o extendedglob
_donothing() {}
alias '@=_donothing # '
handle_@() {
  [[ "${2}" == _donothing ]] && {
    print -r - "${1}"
  }
  return 0
}
preexec_functions=(handle_@)

관련 정보