이스케이프나 인용 없이 확장된 쉘을 닫을 수 있는 방법이 있습니까?

이스케이프나 인용 없이 확장된 쉘을 닫을 수 있는 방법이 있습니까?

예를 들어 zsh명령 앞에 noglob"파일 이름 생성 끄기(와일드카드)"를 붙일 수 있습니다.

저는 비슷한 방법을 사용하여 와일드카드뿐만 아니라 모든 유형의 확장을 비활성화할 수 있는 셸을 찾고 있습니다. 이유: 복잡한 명령에 백슬래시를 사용하거나 인용하면 A) 읽고 이해하기 어렵고 B) 다른 중첩 수준에서 재사용하기에 적합하지 않게 됩니다.

답변1

에서는 zsh다음을 수행할 수 있습니다.

set -o interactive_comments -o extendedglob
alias '@=:;# '
handle_@() {
  local match
  if [[ $1 = (#b)@\##[[:space:]]##([^[:space:]]##)[[:space:]]#(*) ]] $match
}
preexec_functions+=(handle_@)

그런 다음 명령 앞에 @ (전체 편집 버퍼를 구성해야 함, no foo; @ cmdnor foo | @ cmd등), 그 뒤의 첫 번째 단어는 명령 이름으로 처리되고 나머지 줄은 명령에 인수로 전달됩니다.

$ @ echo asd'@123 # # qwe $x ``
asd'@123 # # qwe $x ``

이는 매개변수가 공백으로 시작하거나 개행 문자를 포함할 수 없음을 의미합니다.

이는 별칭 , noop 명령(후크를 실행하기 위해 )과 주석 리더를 사용하여 @수행되므로 나머지 줄은 주석으로 구문 분석되어 삭제됩니다.:;#:preexec

preexec후크 에서는 처리되지 않은 줄(in $1)을 명령과 인수로 분할합니다. \##이전 버전(5.3 이하)의 버그 는 해당 부분에서 해결될 수 있습니다 #. 주석이 s에 포함되지 않은 4.3.12(2011년부터) 이하에서는 작동하지 않습니다.@zshprexec()$1

흥미롭게도 zsh에는 quote-region및 위젯도 있습니다(기본값은 quote-lineemacs 모드에서 각각 Alt+ "Alt+ 에 바인딩됨 '). 이는 올바른 인용을 직접 수행하는 수고를 덜어줍니다.

예를 들어 다음과 같이 할 수 있습니다.

$ perl -e Ctrl+Space$x = '무엇이든';...Alt+"

Ctrl+Space또는 Ctrl+@(터미널은 일반적으로 NUL 문자를 보냅니다)이 설정 됩니다영역.

On 에서는 Alt+"다음과 같이 변환됩니다.

perl -e '$x = '\''whatever'\'';...'

그리고영역이제 인용해 보세요. 당신은 또한 볼 수 있습니다https://stackoverflow.com/q/5407916설정 방법 알아보기영역(선택) Shift+ 화살표/모션 키를 사용하세요.

관련 정보