复制终端中的最后一个命令


22

我可以按up arrow以下示例在终端中看到最后一个命令:

我输入了cd /

Makss-Mac:~ maks$ cd /

...按下enter,命令已cd /执行,现在我可以再次按下up arrow并查看命令cd /

Makss-Mac:/ maks$ cd /

我不仅要查看最后一个命令,还要将其复制到剪贴板。

也许存在一种快捷方式,它不仅可以在终端中显示最后一个命令(像up arrow这样),还可以同时将其复制到剪贴板。

或者,也许有捷径可用于从当前端子线中选择所有端子。因此,up arrow通过按,我将能够复制上一个命令(按以后)super+c。我当然可以用鼠标选择它。但是,如果命令的长度比命令长10倍,cd /则可能会非常耗时,尤其是如果每30秒执行一次。

也许有办法为终端编写插件


如果以后可以添加一些有关打算对剪贴板内容进行处理的详细信息,则可能更容易在此处找到解决方案。您要粘贴到哪里?
nohillside

是的,将其粘贴到另一个终端选项卡中
Maxim Yefremov,2013年

Answers:


17

将此放入您~/.bashrc ~/.bash_profile喜欢的任何地方:

alias copyLastCmd='fc -ln -1 | awk '{$1=$1}1' | pbcopy '

打开新窗口(或运行source ~/.bash_profile)后,您应该可以运行copyLastCmd并将命令放入剪贴板。

要解释发生了什么:您基本上是在使用“ fix command”(fc)来获取最后一个命令,删除前导和尾随空格以进行更好的格式化,awk然后使用将其复制到Mac的粘贴板中pbcopy

编辑:

现在我们知道您要复制粘贴到另一个终端选项卡,还有另一个选择:将这些行添加到您~/.bashrc ~/.bash_profile喜欢的地方或您喜欢的任何地方:

shopt -s histappend
PROMPT_COMMAND='$PROMPT_COMMAND; history -a; history -n'

然后,一旦您打开了一些新的标签(我们称它们为“标签A”和“标签B”):

  1. 执行选项卡A中的任何命令
  2. 切换至标签B,在行上按Enter ,为您提供“新”新行(从而重新评估历史记录)
  3. 使用向上箭头一次,您应该在选项卡A中输入刚刚输入的命令。

编辑2: 我已经在上面的原始答案中替换了sedwith 的用法awk,以照顾到前导和尾随空格。


真是个好别名!为了切断结尾的新行,因此您可以在粘贴后编辑命令,我使用了awkalias copyLastCmd='fc -ln -1 | sed '1s/^[[:space:]]*//' | awk 1 ORS="" | pbcopy '
nwinkler 2013年

@nwinkler:哦,您是对的,应该使用awk:fc -ln -1 | awk '{$1=$1}1'会删除尾随和前导空格。
Asmus

1
必须修改特殊字符的别名alias copyLastCmd="fc -ln -1 | awk '{\$1=\$1}1' | pbcopy"。仍然得到我的支持
Mike D

1
我一直使用它,直到我在一个终端上执行了“ git -reset --hard”操作,然后在另一个“毫无怀疑的git文件夹”中按了向上箭头并仓促地输入,因为我以为我正在运行以前使用的脚本。您可以想象发生了什么事,那是我最后一次使用这种共享的“全球”历史
MrGigu

@MrGigu发生在我身上,具有“本地”历史记录,我无意中两次按了“向上”箭头,而不是一次。
Asmus

5

这是基于@Asmus的答案的另一种方法。为了使他的别名在我的bash脚本中起作用,我不得不使用一些引号,因为在没有一些其他引号的情况下,单引号不能在单引号的别名中起作用:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' | pbcopy'

'\''将基本接近目前的报价,然后添加一个逃脱的报价,然后再次打开实际报价。

上面的版本会将最后一个命令复制到剪贴板,粘贴后,它会立即执行,因为它的末尾会有换行符

要在最后消除换行符,以便实际上可以在运行命令之前对其进行编辑,可以执行以下操作:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' ORS='\'''\'' | pbcopy'

ORS=''(这是没有报价)将剥离后的换行符,这样你就可以运行它之前编辑粘贴的文本。


5

这将使用历史记录扩展来获取最后一个命令并回显它。您可以通过管道pbcopy将最后一个命令保存到剪贴板。

> echo !! | pbcopy

如果您希望历史记录中的命令不是最后一个,则可以运行:

> history

并参考所需的命令编号,例如:

> echo !5 | pbcopy

它可能是您的最爱,甚至可能起作用,但是您需要对命令的实际作用以及OP(五年前接受了答案之一的人)如何有效使用它进行一些说明。
IconDaemon

@IconDaemon好电话。我认为这值得增加一个老问题,因为它比接受的答案更简单,因为它不需要任何个人资料定制。
山姆·贝瑞

4

我来到这里时是想出Sam Berry的完全相同的答案,但是它对我不起作用(OSX 10.14.6)。

设法做到这一点!!

echo "!!" | pbcopy


3

您可以将历史记录设置为忽略以空格开头的命令:

export HISTIGNORE=' *'

然后运行以下命令,将最后一个命令混入剪贴板(确保开头有空格):

history 1 | cut -d " " -f 4- | pbcopy

然后,您可能希望将命令另存为别名,以使其更容易记住。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.