我创建了一个函数剪辑,它通过首先重新运行它来将最后一个命令的输出复制到剪贴板。
#copy previous output to clipboard
function clip(){
echo $(!!) | pbcopy
}
当我在终端中运行函数中包含的单独行时,它可以正常工作。但是,如果我尝试将其保存为我的.zshrc中的函数并通过调用clip执行它,我会收到以下错误:
zsh: command not found: !!
我无法让自动扩展工作正常,任何帮助都会受到赞赏。
答案 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
。