재고 표준은 별칭이 포함된 다음과 같이 동작합니다. zsh
예:-
a-a
% zsh -f
svelte% alias a-a=date
svelte% a-a
Sun 19 Jul 2020 17:20:05 +07
내 구성은 다음과 같이 작동합니다.
% alias a-a=date
% alias | grep a-a
a-a=date
% a-a
zsh: command not found: a-a
하이픈이 없는 별칭은 잘 작동합니다.
zsh
하이픈으로 명명된 별칭을 찾을 수 없게 만드는 옵션은 무엇입니까 ?
답변1
"&');<>`|
이 옵션을 설정하면 zsh에서 작업 별칭에 허용되지 않는 기본 10자 외에 posixaliases
12자가 추가됩니다 .
#$(*-?[\]^{~
여기에는 대시가 포함되며 -
대시 없이도 작동합니다 posixaliases
.
별칭 옵션
별칭에 영향을 미치는 zsh에는 몇 가지 옵션이 있습니다.
ALIASES ALIAS_FUNC_DEF POSIX_ALIASES
이 aliases
옵션은 제어 전용 옵션과 달리 모두 활성화하거나 전혀 활성화하지 않습니다 a-b
.
이는 aliasfuncdef
함수 정의를 구문 분석하는 방법과 더 관련이 있습니다.
접미사 별칭
그래서 시도해야 할 유일한 것은 posixaliases
. 그 남자의 설명은 이렇습니다.
이 옵션이 설정되면 예약어는 별칭 확장의 후보가 아닙니다.
이 문제에는 적용되지 않는 것 같습니다.
POSIX 정의 별칭
그러나 알고 있는 것은POSIX 설명 alias
은 다음과 같습니다.:
3.10 별칭
쉘 명령 언어에서 밑줄, 숫자, 이식 가능한 문자 집합의 문자와 "!", "%", ",", "@" 문자로만 구성된 단어입니다.
구현에서는 별칭의 추가 문자를 확장자로 허용할 수 있습니다.
즉, POSIX의 경우 사용 가능한 문자 목록은 입니다 _0-9a-zA-Z!%,@
. 확장으로 허용되는 경우에도
설명에는 대시가 포함되지 않습니다 .-
따라서 a는 다소 posix_alias
제한적일 수 있습니다. 사실 그렇습니다.alias
별칭에 허용되는 문자
일반적으로 유효한 문자 목록은 alias
다소 모호하고 찾기가 어렵습니다. 실제로 모든 유니코드 문자를 허용하는 것 같습니다.
% for c in ä å é ë þ ü ú í ó ö á ß ð f g h ï œ ø ¶ æ œ © ® b ñ µ ç;
> do d=a${c}b;
> alias $d="echo alias $d";
> done
% alias
a©b='echo alias a©b'
a®b='echo alias a®b'
aµb='echo alias aµb'
a¶b='echo alias a¶b'
aáb='echo alias aáb'
aßb='echo alias aßb'
aäb='echo alias aäb'
aåb='echo alias aåb'
aæb='echo alias aæb'
açb='echo alias açb'
aéb='echo alias aéb'
aëb='echo alias aëb'
aíb='echo alias aíb'
aïb='echo alias aïb'
aðb='echo alias aðb'
añb='echo alias añb'
aób='echo alias aób'
aöb='echo alias aöb'
aøb='echo alias aøb'
그러나 zsh는 ASCII 문자를 사용할 때 더 제한됩니다.
% for c in ! @ % +; do d=a${c}b; alias $d="echo alias $d"; done
그러나 a!b
로 인용된 경우에만 작동하며 a\!b
일부 문자는 # $ ^ *
쉽게 사용할 수 없습니다(위에서는 사용되지 않음).
실제로 {\ ..~}
전체 ASCII 목록을 테스트하여 별칭을 정의하는 것이 가능합니다.
for c in {\ ..~}; do d="a${c}b"; alias $d="echo alias ${(q)d}";done
그러나 일부 별칭만 실제로 작동합니다.
for c in {\ ..~}; do d="a${c}b"; if e=$(eval $d) 2>/dev/null; then print $d $e; else print "failed char: $c"; fi; done
10개의 실패한 문자가 표시됩니다. "&');<>`|
일부 구문 문자는 별칭으로 정의될 수 있지만 작동하지 않습니다(따옴표 제외). 일부 문자는 파일 시스템에서 검색된 패턴 문자 <=>&;
이며 일부 별칭은 잘못 정의되었습니다.[?
인용되지 않음문자: \`$#
.
POSIX 별칭에서는 "따옴표가 없는 일반 문자"만 유효할 수 있습니다. zsh에서는 위 테스트에서 posixaliases
12개의 추가 문자가 직접 나타나도록 필수 정의를 설정합니다.failed chars
#$(*-?[\]^{~
이러한 문자는 작업 별칭에 사용할 수 없습니다. 그 중에는 -
문제의 원인도 있습니다.
메모 man zsh
:
POSIX_ALIASES가 설정되면 따옴표가 없는 일반 문자열만 별칭에 적합합니다. 내장 별칭은 정규화되지 않은 별칭을 거부하지 않지만 확장하지는 않습니다.
답변2
간단한 대답은 setopt aliases
(언급하지 않은 것처럼 하이픈 없는 별칭이 계속 작동합니까)입니다.
그다지 간단하지 않은 문제 - 이와 같은 대화형 줄을 "a 마이너스 a"로 처리할 수 있는 수학/계산 타사 플러그인을 로드하지 않고 있습니까?
분명히 크고 복잡한 구성(누가 그렇지 않은지...)이 있으므로 먼저 모든 외부 코드(예: zsh-lovers 트릭)를 비활성화하십시오. 이는 zsh 옵션 자체가 아니라 간섭의 원인일 가능성이 가장 높기 때문입니다.