将最后一个 bash 命令复制到剪贴板

eal*_*nso 10 bash shell history

有时我需要将最后输入的 shell 命令保存到剪贴板中。我可以做这样的事情:

echo !! | xsel --clipboard
Run Code Online (Sandbox Code Playgroud)

哪个工作成功。

但是当我尝试为上面的命令添加别名时:

alias echoxs='echo !! | xsel --clipboard'
Run Code Online (Sandbox Code Playgroud)

事情没有按预期进行。特别是,剪贴板内容变成字面意思!!。显然,我遗漏了 bash 如何预处理命令和别名的一些内容。我希望别名(直观而言)类似于 C 宏,并且输入别名相当于输入其目标。

我尝试过其他方法,但似乎都不起作用。在脚本内部使用HISTFILE不起作用,因为命令被 shell 会话缓存并且不会立即写入文件,或者多个终端弄乱文件,导致文件中的最后一个命令并不总是可靠地是当前会话中的最后一个命令。

alias='history 1 | xsel --clipboard'
Run Code Online (Sandbox Code Playgroud)

几乎可以工作,除了尝试修改(例如,剪切或 sed)历史记录的输出时所有失败,因为它是内置命令。

有没有办法通过正常的标准输出获取 shell 的最后一个命令?

jul*_*enc 12

我不确定您所说的“尝试修改历史输出时失败”是什么意思,所以我希望我的解决方案适合您。我用来fc获取最后一个命令:

fc -ln -1 | xsel --clipboard
Run Code Online (Sandbox Code Playgroud)

以下是各个选项的含义:

  • l就是使用标准输出
  • n是隐藏命令历史编号
  • -1就是从历史记录中获取最后一条命令

  • `fc` 是 ksh 的原始历史编辑命令;该名称代表“修复命令”。ksh 中的 `!!` 相当于“fc -e -”(“不带编辑器的修复命令”,仅运行该命令),通常别名为“r”,表示“重做”。 (2认同)