我知道我可以使用将命令的结果保存到变量中,last_output=$(my_cmd)但我真正想要的是$last_output每次运行命令时都进行更新。是否有我可以安装的变量、zsh 模块或插件?
我想我的问题是在stdout某处永久写入(至少在下一个命令之前)?这样我就可以操作上一个命令的结果而不必重新运行它。这对于需要很长时间运行的命令非常有用
如果您运行以下命令:
exec > >(tee save.txt)
# ... stuff here...
exec >/dev/tty
Run Code Online (Sandbox Code Playgroud)
...那么您在两个命令之间运行的所有内容的标准输出都将转到标准输出和save.txt.
当然,您可以编写一个 shell 函数来为您执行此操作:
with_saved_output() {
"$@" \
2> >(tee "$HOME/.last-command.err >&2) \
| tee "$HOME/.last-command.out"
}
Run Code Online (Sandbox Code Playgroud)
...然后随意使用:
with_saved_output some-command-here
Run Code Online (Sandbox Code Playgroud)
...而且 zsh 几乎肯定会提供一种机制来包装交互式输入的命令。(在 bash 中,我可以更直接地与之交谈,您可以使用 DEBUG 陷阱做同样的事情)。
但是,即使可以,也不应该这样做:当您将 stdout 和 stderr 拆分为两个流时,有关写入的确切顺序的信息将丢失,即使这些流稍后重新组合。
因此,输出
O: this is written to stdout first
E: this is written to stderr second
Run Code Online (Sandbox Code Playgroud)
可以变成:
E: this is written to stderr second
O: this is written to stdout first
Run Code Online (Sandbox Code Playgroud)
当这些流单独通过tee子进程以将副本写入磁盘时。还存在缓冲问题,以及由检查是否输出到 TTY 并更改其行为的软件引起的行为差异(例如,软件在直接写入控制台时打开彩色编码输出,而在写入到文件或管道)。