使用zsh
,我想创建一个别名或一个 shell 函数,其操作如下:
我希望此别名或 shell 函数回显其命令行,而不遵循任何 shell 控制字符,例如<
or >
or &
or or $
or "
or other。
换句话说,考虑以下示例,其中我使用“xxx”作为此建议的别名或 shell 函数的名称:
xxx ls -Flastr "${something}" >/tmp/xyz &
它会简单地回显如下内容,而不执行它,包括>
and&
和$
and {
and }
and "
,并且不尊重任何这些特殊字符:
ls -Flastr "${something}" >/tmp/xyz &
我知道我可以通过在“xxx”之后引用命令行的其余部分并可能转义某些字符来做到这一点,但我正在寻找一种方法来实现这一点,而无需任何额外的引用或转义。
另外,我希望这仅对通过此别名或 shell 函数调用的一行有效,而不是对整个脚本有效。
这在下可能吗zsh
?
先感谢您。
答案1
执行此操作的一个技巧是编写一个以 结尾的别名,#
使该行的其余部分成为注释,然后从历史记录中提取该行。必须使用 启用评论setopt interactive_comments
。然而,很难知道从哪里开始打印。这个简单的版本只打印整行。
function xxx_function { print -lr -- ${history[$HISTCMD]}; }
alias xxx='xxx_function #'
答案2
这是 Stéphane Chazelas 建议的变体,它对我有用。我根据下面 Stéphane Chazelas 的评论更正了原来的“答案”......
set -o interactive_comments -o extendedglob
_donothing() {}
alias '@=_donothing # '
handle_@() {
[[ "${2}" == _donothing ]] && {
print -r - "${1}"
}
return 0
}
preexec_functions=(handle_@)