zsh:别名或 shell 函数,仅回显其命令行,包括 shell 控制字符

zsh:别名或 shell 函数,仅回显其命令行,包括 shell 控制字符

使用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_@)

相关内容