【问题标题】:bash/zsh output line in command line [closed]命令行中的 bash/zsh 输出行 [关闭]
【发布时间】:2014-03-22 23:51:21
【问题描述】:

我一直在四处寻找,但到目前为止我还没有找到任何答案。我 Bash/Zsh,我知道

echo !! 
echo !$

等等。但是有没有办法召回最后一个输出行?我知道我可以简单地编辑该行并添加一些管道信息,但我想知道是否有替代方案。为了说明,我可能想要执行以下操作

ls -tr
vim {whatever key to recall the last line}

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

如果有人问过类似的问题,但我找不到,能否请您将我重定向到该问题?

【问题讨论】:

  • 不,shell 不会跟踪任何命令的输出,这不是它的工作。此外,这可能与 SO 无关。
  • 感谢您的回答。我在 SO 上看到了一些“类似”的问题,所以我认为没关系。虽然可能是错的......
  • 如果您使用tmux,您可能可以编写脚本以复制其输出缓冲区的最后一行。这不会是直截了当的,而且我现在可以投入更多的工作来弄清楚。希望此评论能激发某人(或我未来的自己)调查细节并发布答案。

标签: bash zsh shortcuts


【解决方案1】:

我认为你运气不好。 shell 可能必须存储大量信息(想象一下长时间运行的进程及其输出)。

你的例子:

ls -tr
vim {whatever key to recall the last line}

也许一个可接受的替代方法是使用子shell:

ls -tr
vim $(!!)

在子shell中重新执行你的最后一个命令,输出被用作vim的参数。

【讨论】:

  • 感谢您的回答。确实,这可能是一种选择。
  • re- “shell 可能必须存储大量信息” 无论如何,大量信息已经存储了——它是可见的回滚缓冲区。但这不在 shell 的域中,而是在终端的域中。
  • 可见的回滚缓冲区通常是有限的,不是吗?
【解决方案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。存在竞争条件和其他缺点,所以 我建议不要在敏感环境中使用此解决方案。

【讨论】:

    猜你喜欢
    • 2015-09-18
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2018-01-16
    • 2016-08-07
    • 1970-01-01
    相关资源
    最近更新 更多