
별칭이 예약어를 숨기는 경우 해당 예약어에 어떻게 액세스할 수 있나요?
이것은 if
잘 작동합니다:
% if : ; then echo true; fi
true
별칭 뒤 if
:
% alias if=date
% if : ; then echo true; fi
zsh: parse error near `then'
접두사 builtin
또는 \
도움이 되지 않습니다:
% builtin if : ; then echo true; fi
zsh: parse error near `then'
% \if : ; then echo true; fi
zsh: parse error near `then'
별칭으로 인해 숨겨진 병리적인 경우 예약어에 액세스하는 방법은 무엇입니까?
답변1
힐리의 대답나한테 지적해줘POSIX 쉘 명령 언어 섹션 2.3.1이는 다음과 같이 말합니다.
그러나 올바른 구문 컨텍스트의 예약어는 별칭 대체 후보가 되어서는 안 됩니다.
{ba,z}sh
기본 동작이 위 내용을 따르지 않음 을 확인했습니다 .
나는 물었다zsh-workers
옵션으로 이동합니다 POSIX_ALIASES
.매뉴얼 페이지설명하다:
POSIX_ALIASES <K> <S> When this option is set, reserved words are not candidates for alias expansion: it is still possible to declare any of them as an alias, but the alias will never be expanded. Reserved words are described in the section RESERVED WORDS in zshmisc(1).
답변2
이 오류가 없는 셸을 사용해 보세요.
표준에 따르면 예약어는 별칭 확장을 받을 수 없습니다.
그래서:
alias if=echo
if : ; then echo true; fi
true
인쇄를 위해 적절하게 작성된 쉘을 사용하십시오.
그러나 불행 bash
하게도 여기서도 사실이 아니며 동작은 정확합니다 .ksh93
bosh
dash
추가 힌트 제공:
별칭 앞의 백슬래시는 적절하게 작성된 셸에서 별칭을 비활성화합니다.
예약어 앞의 백슬래시는 토큰을 일반 단어로 만듭니다.
결과적 \if
으로 별칭은 비활성화되지만 예약어가 아닌 단어가 됩니다.