예를 들어 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; @ cmd
nor foo | @ cmd
등), 그 뒤의 첫 번째 단어는 명령 이름으로 처리되고 나머지 줄은 명령에 인수로 전달됩니다.
$ @ echo asd'@123 # # qwe $x ``
asd'@123 # # qwe $x ``
이는 매개변수가 공백으로 시작하거나 개행 문자를 포함할 수 없음을 의미합니다.
이는 별칭 , noop 명령(후크를 실행하기 위해 )과 주석 리더를 사용하여 @
수행되므로 나머지 줄은 주석으로 구문 분석되어 삭제됩니다.:;#
:
preexec
preexec
후크 에서는 처리되지 않은 줄(in $1
)을 명령과 인수로 분할합니다. \##
이전 버전(5.3 이하)의 버그 는 해당 부분에서 해결될 수 있습니다 #
. 주석이 s에 포함되지 않은 4.3.12(2011년부터) 이하에서는 작동하지 않습니다.@
zsh
prexec()
$1
흥미롭게도 zsh에는 quote-region
및 위젯도 있습니다(기본값은 quote-line
emacs 모드에서 각각 Alt+ "및 Alt+ 에 바인딩됨 '). 이는 올바른 인용을 직접 수행하는 수고를 덜어줍니다.
예를 들어 다음과 같이 할 수 있습니다.
$ perl -e Ctrl+Space$x = '무엇이든';...Alt+"
Ctrl+Space또는 Ctrl+@(터미널은 일반적으로 NUL 문자를 보냅니다)이 설정 됩니다영역.
On 에서는 Alt+"다음과 같이 변환됩니다.
perl -e '$x = '\''whatever'\'';...'
그리고영역이제 인용해 보세요. 당신은 또한 볼 수 있습니다https://stackoverflow.com/q/5407916설정 방법 알아보기영역(선택) Shift+ 화살표/모션 키를 사용하세요.