Linux(例如 Ubuntu)终端,有没有方法可以获取最后一行?假设我随机输入一个td
命令,该命令尚未安装在我的系统上,因此我将收到如下消息。我希望有一个“快捷方式”来sudo apt-get install textdraw
快速运行。
是否有这样的工具或者我怎样才能不使用鼠标将最后一行复制到剪贴板?
username@WorkStation:~$ td
The program 'td' is currently not installed. You can install it by typing:
sudo apt-get install textdraw
username@WorkStation:~$
答案1
如果你不介意一点淫秽内容(我不介意),你可能想使用他妈的,一个可以完全满足您要求的工具。
嗯,不完全是,但它解决了同样的问题。它不只是获取最新行,而是尝试匹配您输入的最后一个命令。
Fuck 尝试匹配前一个命令的规则,使用匹配的规则创建一个新命令并运行它。
存储库中显示的示例展示了您提到的几种场景。
答案2
在 tmux v2.4 及更高版本中(自此提交以来https://github.com/tmux/tmux/commit/76d6d3641f271be1756e41494960d96714e7ee58) 替换为send-keys -X
。在旧版本中,可能存在不同的语法。
在.tmux.conf
:
bind ! copy-mode \;\
send-keys -X cursor-up \;\
send-keys -X select-line \;\
send-keys -X cursor-left \;\
send-keys -X copy-selection-and-cancel \;\
paste-buffer
现在,prefix+!
将复制当前光标位置的最后一行。
cursor-left
如果不想输入 return 而直接执行,则可以省略。
笔记:如果最后一行为空或者换行,它将不起作用,但在大多数情况下它仍然有用
答案3
简短的回答:不,可能您没有可用的方法来做到这一点。
长答案:
- 虽然它可能的拥有一个终端仿真器,允许您“仅仅”读回屏幕内容并进行编辑,但实际上这并不经常做,因为担心一些不需要的程序可能会窥探您的键盘输入。
- 如地狱可以旨在捕获命令的输出并允许您编辑它(就像命令历史记录一样)。如果命令是类似这样的命令
vi
(其中输出不是漂亮的面向行的文本),情况就会变得复杂。无论如何,bash 不会这样做。
实际上,人们为了解决这个限制,会使用其他程序来捕获命令输出,然后对其进行编辑。但这并不能解决你当前的问题。
例如,我使用类似 emacs 的 vi发出临时 shell 命令。如果这些命令不需要进一步输入,则最好在窗户,捕获命令的输出 — 并根据需要编辑输出以优化命令。Emacs 和 vim 也允许您执行类似的操作。
答案4
要执行最新命令的最后一行输出,如果您愿意重新执行该命令(因为它除了发出诊断消息外没有执行任何操作),请执行
$($(fc -ln -1) | tail -n 1)
一步一步(一层一层):
fc
(可能代表“修复命令”)是用于访问命令历史记录的 shell 内置命令。-ln
l
(小写 L)—升ist 上一个命令n
— 不包括命令n号码
1
(一) — 指的是最近的命令
fc -ln -1
列出最近的命令,不包括命令编号。$(fc -ln -1)
执行最新的命令。$(fc -ln -1) | tail -n 1
执行最近的命令并显示其输出的最后一行。sudo apt-get install textdraw
在您的示例中,这就是该行。$($(fc -ln -1) | tail -n 1)
执行那命令。
您可以为其添加别名:
alias execute_last_line_of_output_from_previous_command='$($(fc -ln -1) | tail -n 1)'
我让你自己选择一个更短的别名。
笔记:
- 这仅适用于简单命令 — 不能使用特殊字符,例如
|
、<
、>
、;
,&
甚至引号。如果您需要处理复杂命令,您可能可以通过添加 来实现eval
,但一般不建议这样做。 - 如果您需要访问输出的最后一行以外的其他内容(例如,倒数第十七行),您可以执行以下某行操作
tail -n 17 | head -n 1
。 - 如果您需要访问除最新命令之外的其他命令,则可以将参数更改为
fc
。请注意 是fc -ln -1
的缩写fc -ln -1 -1
。要检索第三条最新命令,请使用fc -ln -3 -3
。 - 如果您需要像上述那样的灵活性,您可能应该编写一个接受参数而不是别名的 shell 函数。