stdout是存储在文件系统或内存中的某个地方吗?

时间:2013-12-31 21:17:18

标签: shell stdout zsh

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

我想我的问题是stdout是否永久写在某处(至少在下一个命令之前)?这样我就可以操纵上一个命令的结果,而不必重新运行它。这对于需要很长时间才能运行的命令非常有用

2 个答案:

答案 0 :(得分:4)

如果您运行以下内容:

exec > >(tee save.txt)
# ... stuff here...
exec >/dev/tty

...然后你在两个命令之间运行的stdout将同时转到stdout和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中,我可以直接说话,你可以用DEBUG陷阱做同样的事情。)


但是,即使您可以也不应该执行此操作:将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并改变其行为(例如,在直接写入控制台时打开彩色编码输出的软件,以及在写入控制台时关闭的软件。文件或管道)。

答案 1 :(得分:2)

stdout 只是一个文件句柄,默认情况下连接到控制台,但可以重定向。

yourcommand > save.txt

如果要将输出显示到控制台并将其保存到文件中,同时可以将输出传输到 tee ,则会在 stdin上写入所有内容的命令 stdout 以及您选择的文件:

yourcommand | tee save.txt