将上一个bash命令复制到剪贴板中。

10
有时候我需要将最后输入的shell命令保存到剪贴板中。 我可以这样做:
echo !! | xsel --clipboard

哪个成功地运作。

但是当我尝试给上述命令起别名时:

alias echoxs='echo !! | xsel --clipboard'

事情并不如预期那样运行。特别是,剪贴板的内容变成了字面上的!!。显然,我对bash如何预处理命令和别名有所遗漏。我原本希望别名像C宏一样直观,键入别名应该等同于键入其目标。
我尝试了其他方法,但都没有奏效。在脚本中使用HISTFILE不起作用,因为要么命令被shell会话缓存而不立即写入文件,要么多个终端会干扰文件,导致文件中的最后一个命令并不总是当前会话中的最后一个命令。
alias='history 1 | xsel --clipboard'

几乎可以工作,但是当尝试修改(例如剪切或替换)历史记录的输出时,所有操作都会失败,因为它是一个内置命令。
有没有一种方法可以通过正常的标准输出获取shell的最后一个命令?

我仍然得到了字面值!! - ealfonso
顺便提一下,在问题标题中使用“不起作用”通常是不好的形式;最好使用一个描述它为什么不起作用的短语(因此进行了编辑)。 - Charles Duffy
1
Bash别名与csh/tcsh别名不同,不会扩展参数。请查看info bash并搜索alias以获取详细信息。 - Keith Thompson
@CharlesDuffy,我不想把我的问题范围局限于shell别名,这就是为什么我试图给它起一个更通用的标题。例如,可能脚本可以成为答案(但事实并非如此)。但你是正确的。无论如何,我应该把它命名为“将最后一个bash命令复制到剪贴板”。 - ealfonso
我很好奇为什么使用别名无法正常工作,但是在终端中执行却可以。我也遇到了同样的问题。 - young_souvlaki
3个回答

11

我不确定你所说的关于“尝试修改历史输出时失败”的内容,所以我希望我的解决方案能够适用于你。我使用fc命令来获取最后一条命令:

fc -ln -1 | xsel --clipboard

以下是选项的含义:
  • l:使用标准输出
  • n:隐藏命令历史编号
  • -1:从历史记录中获取上一个命令

不知道fc是什么。 - ealfonso
2
fc 是来自 ksh 的原始历史编辑命令;名称代表“修复命令”。在 ksh 中,“!!”的等效命令是“fc -e -”(“没有编辑器的修复命令”,它只运行命令),通常别名为“r”以进行“重做”。 - Mark Reed
1
如果你使用的是OSX系统,我推荐一个很棒的别名:alias copyLastCmd="fc -ln -1 | pbcopy"。每当你需要保存一个天才想法时,你可以快速调用它。 - Dawson B
要删除复制命令末尾的换行符,您可以运行以下命令代替:"fc -ln -1 | tr -d '\n' | pbcopy" - Giovanni Benussi

1

客户端:在此会话中传递选项-XYssh命令,以启用(受信任的)X11转发:

ssh -XY USER@IP

服务器:检查/etc/ssh/sshd_config,确保服务器启用了X11转发功能。

X11Forwarding yes

yum install xclip -y
echo `hostname -I` `hostname` >> /etc/hosts
echo "alias cplastcmd='history 2 | cut -c 8- | head -n 1 | xclip -selection clipboard'" >> ~/.bashrc

重新启动bash并键入cplastcmd,通过X11将最后一个bash命令复制到剪贴板中。

0
我在.zshrc中有以下的别名,我觉得非常有帮助,而且能够很顺利地满足需求。
# Function to execute before each command with your command as argument
function preexec() {
    PREV_COMMAND=$1
    # echo "Prev command: $PREV_COMMAND"
    echo "\$ $PREV_COMMAND" | pbcopy
}

以下内容可能有助于了解背景情况:
请注意:我们在这里没有使用“precmd”,但在这种情况下可能会有用。
Zsh中的"preexec"和"precmd"函数是在执行命令行时调用的挂钩。它们各自有不同的用途:
1. "preexec":在任何命令行执行之前执行此函数。常用于启动计时器、操作即将运行的命令或记录命令以供日后使用等操作。
2. "precmd":在每个提示符之前执行此函数。常用于在用户被提示输入下一条命令之前执行某些任务,例如打印有关上一个命令的信息、显示Git分支信息或更新终端的标题等操作。
为了更好地理解,可以想象在终端中运行命令时的操作顺序:
  • 输入命令并按回车键。
  • preexec 函数以你的命令作为参数运行。
  • 执行你的命令。
  • precmd 函数在下一个提示符显示之前运行。

这些钩子函数为你提供了在进程的特定点运行自己的代码的机会。它们是用于自定义你的shell的强大工具,可以用来实现各种功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接