我意识到我在这个问题上花的时间比必要的多,因此提出了这个问题。
有时我需要将最后键入的shell命令保存到剪贴板中。我可以这样做:
echo !! | xsel --clipboard
这是成功的。
但是当我尝试对上面的命令使用别名时:
alias echoxs='echo !! | xsel --clipboard'
事情并不像预期的那样工作。特别是,剪贴板内容变成了字面上的!!
。显然,我忽略了bash如何预处理命令和别名的一些内容。我的希望是别名,直观地说,应该是类似于C宏的东西,并且键入别名将等同于键入其目标。
我试过其他方法,似乎没有一种有效。在脚本中使用HISTFILE
是不起作用的,因为命令被shell会话缓存而没有立即写入文件,或者多个终端扰乱了文件,使得文件中的最后一个命令并不总是当前会话中的最后一个命令。
alias='history 1 | xsel --clipboard'
几乎可以工作,除了当试图修改(例如,cut或sed)历史记录的输出时失败,因为它是一个内置命令。
这是通过sane stdout获取shell的最后一个命令的方法吗?
3条答案
按热度按时间7uhlpewt1#
我不太明白你说的“当试图修改历史输出时失败”,所以我希望我的解决方案能适合你。我使用
fc
获取最后一个命令:以下是选项的含义:
l
使用标准输出n
用于隐藏命令历史编号-1
是从历史记录中获取最后一个命令q1qsirdb2#
客户端:将选项
-XY
传递到ssh
命令,以启用此会话的(受信任)X11转发:服务器:检查
/etc/ssh/sshd_config
以确保服务器上启用了X11转发重新启动bash并输入
cplastcmd
,通过X11将最后一个bash命令复制到剪贴板。q1qsirdb3#
我在
.zshrc
中有以下别名,我发现它非常有用,并且它非常顺利地实现了需求。以下内容可能有助于获取一些上下文
注意:我们在这里没有使用
precmd
,但在此上下文中可能有用。Zsh中的
preexec
和precmd
函数是在执行命令行时调用的钩子。它们各自有不同的用途:preexec
:此函数在执行任何命令行之前执行。它通常用于启动计时器、操作即将运行的命令或记录命令以供以后使用。precmd
:此函数在每个提示符之前执行。它通常用于在提示用户输入下一个命令之前应该完成的任务,例如打印有关上一个命令的信息,显示Git分支信息或更新终端的标题。为了更好地理解它,请考虑在终端中运行命令时的操作顺序:
preexec
函数以您的命令作为参数运行。precmd
函数在显示下一个提示符之前运行。钩子使您有机会在流程中的这些特定点运行自己的代码。它们是自定义shell的强大工具,可以用来实现各种各样的特性。