34

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

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

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

4

11 回答 11

33

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

于 2010-07-20T02:40:41.820 回答
19

script(1)正是您需要的:

script
make
exit
vim typescript

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

于 2010-07-20T03:17:12.950 回答
8

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

$> find . -iname fileInUnknownLocationInHierarchy.txt
./something/buried/deep/where/you/dont/want/to/retype/fileInUnknownLocationInHierarchy.txt
$> vim `!!`
于 2013-03-22T16:44:06.780 回答
3

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

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

于 2010-07-20T03:15:22.220 回答
2

如何使用替代。像这样:

command1
command2
RESULT=`LASTCOMMAND`
echo $RESULT

于 2010-07-20T02:44:47.457 回答
1

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

就标准输出而言,我认为你不能。

于 2010-07-20T02:42:55.577 回答
1

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

当您想确定上一个命令是否成功执行时,这通常会有所帮助,并且您还可以将其构建到构建脚本中以获取通过/失败警报。

于 2013-10-08T17:27:45.203 回答
0

将输出保存为变量?

bash: Output=$(ls); echo $Output
于 2010-07-20T02:43:10.397 回答
0

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

于 2010-07-20T02:59:52.077 回答
0

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

于 2010-07-20T19:23:17.967 回答
0

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

于 2013-05-30T20:01:28.830 回答