历史扩展在 .zshrc 函数中不起作用

history expansion not working in .zshrc functions

我创建了一个函数 clip,通过先重新运行将最后一个命令的输出复制到剪贴板。

#copy previous output to clipboard
function clip(){ 
    echo $(!!) | pbcopy
}

当我 运行 终端函数中包含的单行时,它工作得很好。但是,如果我尝试将它保存为我的 .zshrc 中的函数并通过调用 clip 执行它,我会收到以下错误:

zsh: command not found: !!

我无法使自动扩展正常工作,如有任何帮助,我们将不胜感激。

clip () {
    fc -ILe- | pbcopy
}

解释:

使用 !! 的历史扩展只有在交互式命令行中输入时才有效。它不会在脚本中工作,因为 !! 没有以特殊方式处理(导致 "command not found" 错误)。

相反,您可以使用 fc 命令从历史记录中检索元素。

运行 fc 不带任何参数将检索最后一个历史事件并打开一个包含该事件的编辑器进行编辑。关闭编辑器将 运行 已编辑的命令(不保存编辑将导致执行原始命令)。

上述示例中的参数将按如下方式修改行为:

  • -I: 只获取内部历史事件,即排除从$HISTFILE加载的事件。
  • -L:仅检索本地历史事件,不包括通过 SHARE_HISTORY 从其他会话共享的元素。 (这可能不需要结合-I,但我没有测试这个)
  • -e ename:使用 ename 作为编辑器而不是默认编辑器。如果 ename 设置为 -,则不会打开任何编辑器。

-I-L 不是绝对必要的,但它们可以防止您无意中 运行ning 在之前的某个 shell 会话中最后输入了哪个命令。这很可能是 rm -r *poweroff.

因此组合 fc -ILe- | pbcopy 将检索输入到当前 shell 会话中的最后一个命令并将其输出通过管道传输到 pbcopy.

顺便说一句:您可以只使用 cmd1 | cmd2 而不是 echo $(cmd1) | cmd2,以便能够将 cmd1 的输出传输到 cmd2