【问题标题】:Output of last shell command最后一个 shell 命令的输出
【发布时间】:2023-06-14 00:08:01
【问题描述】:

直到完成一个 3 小时的构建脚本中途,我会记得我想在完成后在输出的开头看到一些东西。在这一点上,我已经超过了终端中的行数,所以我无法向上滚动查看它(或者很难找到开头)。当然,我可以更好地存储我的输出,但我一直很好奇这是否可能。

在 linux shell 中,是否可以返回最后一个命令的输出。我意识到我可以通过管道传输它或将输出发送到文件,但我的要求是命令运行后检索该输出。

使用 csh,但会听到任何 shell。

【问题讨论】:

标签: csh


【解决方案1】:

没有。程序的输出永远不会通过 shell 的手。没有重定向,它直接进入 TTY。通过重定向,它直接进入它被定向到的任何文件或管道。 shell 不知道进程发送到 stdout/stderr 的内容。

【讨论】:

    【解决方案2】:

    script(1) 正是您所需要的:

    script
    make
    exit
    vim typescript
    

    script 程序将启动一个新的 shell 并将输入和输出保存到 typescript 文件。完成后,只需使用 exit^D 关闭 shell。如果您不想启动一个新的 shell 而只是运行您的构建,您可以使用:script -c <command>

    【讨论】:

    • 这很酷。我喜欢你如何使用它来记录一整批命令。
    【解决方案3】:

    如果再次运行该命令不会改变任何内容,您可以使用 !!访问历史堆栈的顶部以重新运行最后一个命令。在反引号中这样做将允许您使用结果。

    $> find . -iname fileInUnknownLocationInHierarchy.txt
    ./something/buried/deep/where/you/dont/want/to/retype/fileInUnknownLocationInHierarchy.txt
    $> vim `!!`
    

    【讨论】:

    • 这可行,但这意味着重新运行命令。如果上一个命令是一个冗长的搜索,你将不得不再次等待它。
    【解决方案4】:

    这对于某些使用光标寻址的命令可能会变得非常混乱。你的 vim 会话的输出是什么?或者一个稍微理智一点的例子:你正在用 wget 下载一个文件,它显示了一个从 0% 到 100% 的百分比条。它的输出是什么?

    我认为您基本上想要当前行和上一个提示之间的任何内容的硬拷贝。这不是 shell 重定向的好例子,这基本上是终端会做的事情。您可以通过在屏幕中复制和粘贴来手动完成它,也许您可​​以使用它的exec 命令自动化它。 tmux 可能有类似的东西,你可以用 Emacs 的 shell 模式做一些奇怪的事情,但这是一个相当重量级的解决方案。 rxvt-unicode 有一个perl extension...

    【讨论】:

      【解决方案5】:

      如何使用替换。像这样:

      command1
      command2
      RESULT=`LASTCOMMAND`
      echo $RESULT

      【讨论】:

      • 反引号是比较棘手的部分。人们倾向于使用单引号或双引号。
      【解决方案6】:

      你可以看到最后一个命令的返回码,至少在 bash 中,$?

      就 stdout 而言,我认为你不能。

      【讨论】:

        【解决方案7】:

        如果您只是在寻找上次执行命令的返回码,请使用echo $?

        这通常有助于您确定上一个命令是否成功执行,并且您还可以将其构建到构建脚本中以发出通过/失败警报。

        【讨论】:

          【解决方案8】:

          将输出保存为变量?

          bash: Output=$(ls); echo $Output
          

          【讨论】:

          • 他在他的问题中说:“我意识到我可以通过管道传输它或将输出发送到文件,但我的要求是在命令运行后检索该输出。”
          【解决方案9】:

          你可以使用 tee 命令将输出放到 STDOUT 以及文件中,然后使用它。

          【讨论】:

            【解决方案10】:

            这是您终端的功能。你应该专注于创建一个你不需要记住做任何事情的设置。一种可能的解决方案是在启用日志记录的情况下在您的登录脚本中启动“屏幕”(这不太容易做到)。

            【讨论】:

              【解决方案11】:

              您始终可以在 emacs shell 窗口中运行该进程。它会保留一切。

              【讨论】: