如果别名隐藏了保留字,如何访问它?
这里if
工作正常:
% if : ; then echo true; fi
true
别名后if
:
% alias if=date
% if : ; then echo true; fi
zsh: parse error near `then'
前缀builtin
or\
没有帮助:
% builtin if : ; then echo true; fi
zsh: parse error near `then'
% \if : ; then echo true; fi
zsh: parse error near `then'
在被别名隐藏的病态情况下,如何访问保留字?
答案1
希利的回答向我指出POSIX Shell 命令语言第 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
尝试使用不存在此错误的 shell。
该标准规定保留字不能进行别名扩展。
所以:
alias if=echo
if : ; then echo true; fi
true
使用正确编写的 shell进行打印。
不幸的是,bash
这里也不正确,但是ksh93
,bosh
并且dash
行为正确。
给出进一步的提示:
别名前面的反斜杠会在正确编写的 shell 中禁用该别名。
保留字之前的反斜杠使该标记成为普通字。
结果\if
会禁用别名,但同时使其成为非保留字。