命令行中bash/zsh的输出行

3
我一直在寻找答案,但到目前为止还没有找到。我会Bash/Zsh,在其中我知道一种变体。
echo !! 
echo !$

等等。但是有没有一种方法可以召回最后一个输出行?我知道我可以简单地编辑该行并添加一些管道信息,但我想知道是否有另一种选择。举个例子,我可能想要执行以下操作。
ls -tr
vim {whatever key to recall the last line}

这将允许我编辑最近的文件。

如果已经有类似的问题并且我无法找到它,您能否请转接我?


不,shell 不会跟踪任何命令的输出,这不是它的工作。此外,在 SO 上可能与主题无关。 - mata
谢谢你的回答,mata。我在SO上看到了一些“类似”的问题,所以我认为这应该没问题。不过可能我错了... - clem steredenn
如果你使用 tmux,你可能能够编写脚本来复制其输出缓冲区的最后一行。这并不是一件简单的事情,需要比我现在可以投入的更多的工作去弄清楚细节并发布答案。希望这条评论能激发某个人(或者是我未来的自己)去调查细节并发布一个答案。 - chepner
2个回答

4
我认为你没有什么好运气。可能需要将大量信息存储在shell中(想象一下长时间运行的进程及其输出)。
对于你的示例:
ls -tr
vim {whatever key to recall the last line}

也许一个可接受的替代方案是使用子shell,用如下方式实现:
ls -tr
vim $(!!)

使用该命令在子shell中重新执行上一个命令,并将输出用作vim的参数。


谢谢你的回答。确实可以考虑这个选项。 - clem steredenn
重新解释:“潜在地,shell 可能需要存储大量信息。” 然而,这些大量信息已经被存储了 —— 它们就是可见的滚动缓冲区。但这并不属于 shell 的范畴,而是终端的范畴。 - K3---rnc
可见的滚动缓冲区通常是有限制的,不是吗? - Brian Agnew

2

好的,有一种方法可以实现你的目标。这只是一个概念验证,我不会真正建议这样做:

> script --flush /tmp/myscript
Script started, file is /tmp/myscript
> LASTLINE() {
     tail -2 /tmp/myscript | head -1 | tr -d '\r'
  }
> bind '"^[[15~":"$(LASTLINE)\n"'
> ls -tr1
file1
file2
fileN
> vi [press F5]

这个想法是使用script作为记忆输入和输出的工具。在这个例子中,它将所有数据存储在文件"/tmp/myscript"中,然后可以读取该文件以获取最后一个结果行。由于实际命令(vi ...)是"myscript"中的最后一行,因此我们读取该文件的最后两行,并使用其中的第一行。(此外,我还需要通过tr过滤回车符。)现在,我们将该命令LASTLINE绑定到F5键(详见In bash, how do I bind a function key to a command?了解如何将命令绑定到键)。从现在开始,您可以按F5键来获取最后一行输出的内容。
如果这样做,请记住您处于子shell中(因为script),可以通过exit离开以返回到原始shell。
注意:这更多地是在玩bash。存在竞争条件和其他缺点,因此我建议不要在敏感环境中使用此解决方案。

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