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

xwbd5t1u  于 2023-06-24  发布在  Shell
关注(0)|答案(3)|浏览(133)

我意识到我在这个问题上花的时间比必要的多,因此提出了这个问题。
有时我需要将最后键入的shell命令保存到剪贴板中。我可以这样做:

echo !! | xsel --clipboard

这是成功的。
但是当我尝试对上面的命令使用别名时:

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

事情并不像预期的那样工作。特别是,剪贴板内容变成了字面上的!!。显然,我忽略了bash如何预处理命令和别名的一些内容。我的希望是别名,直观地说,应该是类似于C宏的东西,并且键入别名将等同于键入其目标。
我试过其他方法,似乎没有一种有效。在脚本中使用HISTFILE是不起作用的,因为命令被shell会话缓存而没有立即写入文件,或者多个终端扰乱了文件,使得文件中的最后一个命令并不总是当前会话中的最后一个命令。

alias='history 1 | xsel --clipboard'

几乎可以工作,除了当试图修改(例如,cut或sed)历史记录的输出时失败,因为它是一个内置命令。
这是通过sane stdout获取shell的最后一个命令的方法吗?

7uhlpewt

7uhlpewt1#

我不太明白你说的“当试图修改历史输出时失败”,所以我希望我的解决方案能适合你。我使用fc获取最后一个命令:

fc -ln -1 | xsel --clipboard

以下是选项的含义:

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

q1qsirdb2#

客户端:将选项-XY传递到ssh命令,以启用此会话的(受信任)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命令复制到剪贴板。

q1qsirdb

q1qsirdb3#

我在.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中的preexecprecmd函数是在执行命令行时调用的钩子。它们各自有不同的用途:

  1. preexec:此函数在执行任何命令行之前执行。它通常用于启动计时器、操作即将运行的命令或记录命令以供以后使用。
  2. precmd:此函数在每个提示符之前执行。它通常用于在提示用户输入下一个命令之前应该完成的任务,例如打印有关上一个命令的信息,显示Git分支信息或更新终端的标题。
    为了更好地理解它,请考虑在终端中运行命令时的操作顺序:
  • 你输入一个命令,然后按回车键。
  • preexec函数以您的命令作为参数运行。
  • 你的命令已执行。
  • precmd函数在显示下一个提示符之前运行。

钩子使您有机会在流程中的这些特定点运行自己的代码。它们是自定义shell的强大工具,可以用来实现各种各样的特性。

相关问题