历史扩展无效.zshrc函数

时间:2017-07-13 19:22:21

标签: bash shell zsh zshrc

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

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

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

zsh: command not found: !!

我无法让自动扩展工作正常,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:3)

clip () {
    fc -ILe- | pbcopy
}

说明:

!!的历史记录扩展仅在键入交互式命令行时才有效。它不会在脚本中起作用,因为!!没有以特殊方式处理(导致“未找到命令”错误)。

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

在没有任何参数的情况下运行fc将检索上一个历史事件并打开包含该事件的编辑器进行编辑。关闭编辑器然后将运行编辑的命令(不保存编辑将导致执行原始命令。)

以上示例中的参数将修改行为,如下所示:

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

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

因此,组合fc -ILe- | pbcopy将检索输入到当前shell会话的最后一个命令,并将其输出传递给pbcopy

BTW:您可以使用cmd1 | cmd2代替echo $(cmd1) | cmd2,以便能够将cmd1的输出通过管道传输到cmd2