Shell stdout是否存储在文件系统或内存中?

Shell stdout是否存储在文件系统或内存中?,shell,stdout,zsh,Shell,Stdout,Zsh,我知道我可以使用last\u output=$(my\u cmd)将命令的结果保存到变量中,但我真正想要的是每次运行命令时更新$last\u output。是否有可以安装的变量、zsh模块或插件 我想我的问题是,stdout是否在某个地方永久写入(至少在下一个命令之前)?这样我就可以操纵上一个命令的结果,而不必重新运行它。这对于运行时间较长的命令非常有用。stdout只是一个文件句柄,默认情况下连接到控制台,但可以重定向 yourcommand > save.txt 如果您希望将输出显示

我知道我可以使用
last\u output=$(my\u cmd)
将命令的结果保存到变量中,但我真正想要的是每次运行命令时更新
$last\u output
。是否有可以安装的变量、zsh模块或插件


我想我的问题是,
stdout
是否在某个地方永久写入(至少在下一个命令之前)?这样我就可以操纵上一个命令的结果,而不必重新运行它。这对于运行时间较长的命令非常有用。stdout只是一个文件句柄,默认情况下连接到控制台,但可以重定向

yourcommand > save.txt
如果您希望将输出显示到控制台并同时将其保存到文件中,您可以将输出通过管道传输到tee,该命令将在stdin上接收到的所有内容写入stdout并写入您选择的文件:

yourcommand | tee save.txt

如果运行以下命令:

exec > >(tee save.txt)
# ... stuff here...
exec >/dev/tty
…然后在两个命令之间运行的所有标准输出都将转到标准输出和
save.txt

当然,您可以编写一个shell函数来完成以下任务:

with_saved_output() {
  "$@" \
  2> >(tee "$HOME/.last-command.err >&2) \
  | tee "$HOME/.last-command.out"
}
…然后随意使用它:

with_saved_output some-command-here
…和zsh几乎肯定会提供一种机制来包装以交互方式输入的命令。(在bash中,我可以更直接地与之交谈,您可以使用调试陷阱做同样的事情)


但是,即使您可以,也不应该这样做:当您将stdout和stderr拆分为两个流时,有关写入的确切顺序的信息将丢失,即使这些流稍后重新组合

因此,输出

O: this is written to stdout first
E: this is written to stderr second
可能成为:

E: this is written to stderr second
O: this is written to stdout first

当这些流分别通过
tee
子进程以将副本写入磁盘时。此外,还产生了缓冲问题,以及由检查是否输出到TTY并更改其行为的软件引起的行为差异(例如,当直接写入控制台时打开颜色编码输出,当写入文件或管道时关闭颜色编码输出的软件).

stdout只是一个文件句柄,默认情况下连接到控制台,但可以重定向。如果需要,可以重定向输出以存储在文件中,然后在显示结果之前操作该文件。如果这样做,我会丢失控制台输出吗?我可以将其重定向到两个位置吗?如果没有开销或副作用,您不能直接重定向到两个位置--每次
write()
调用只能将输出重定向到一个目标--但是您可以重定向到一个进程,例如
tee
,该进程反过来将写入两个位置。请参阅右图,但有什么方法可以使这种情况持续下去吗?关键是,有时我运行的命令比我想象的要长,我不想再次运行它来操作输出,通过使用内置命令execin zsh
exec>>(tee~/save.txt)
您将在将所有输出显示到控制台的同时将其保存到文件save.txt。但是,save.txt将具有所有输出,而不仅仅是最后一个命令的输出。我不知道如何对每个命令执行此操作,但在运行每个命令时不指定它。很抱歉上面缺少空格,**around exec将其改为粗体:exec,但由于在最后一个*后面缺少空格,因此没有翻译星号。