如何将 stdout 保存到文件,stderr 保存到文件,stdout+stderr 保存到文件,并像 shell 脚本一样将 stdout + stderr 保存到终端

Lev*_*evi 4 bash shell-script file-descriptors

如何将 stdout 保存到一个文件,将 stderr 保存到另一个文件,将 stdout+stderr 保存到第三个文件,并像正常的 shell 脚本一样将 stdout + stderr 保存到终端?

我在别处找到了这个:

exec > >(tee std_out) 2> >(tee err_out >&2)
ls # Should got to std_out
fsdfs # Command not found goes to err_out
Run Code Online (Sandbox Code Playgroud)

这真的很接近。如果我运行,bash test.sh 2>&1 | tee output那么它可以工作,但我无权访问我的脚本的运行方式。这是一个cicd系统。我需要能够使用 exec 从脚本内部执行“组合输出”。

我正在创建一个 CI/CD 库,但我无法知道客户将使用该库做什么,所以我想考虑每个用例。

fra*_*san 5

简单地扩展您的方法:

exec 2> >(tee -a stderr stdall) 1> >(tee -a stdout stdall)
Run Code Online (Sandbox Code Playgroud)

标准错误将写入名为 的文件stderr,标准输出将写入,stdout标准错误和标准输出也将写入控制台(或exec运行时两个文件描述符指向的任何内容)和stdall.
tee -a(append) 是必需的,以防止stdalltee开始写入它的第二个覆盖。

请注意,执行重定向的顺序是相关的:第二个进程替换受第一个重定向的影响,即它发出的错误将发送到>(tee -a stderr stdall)。当然,您可以将第二个进程替换的标准错误重定向到/dev/null以避免这种副作用。在标准错误之前重定向标准输出会将每个错误发送到stdoutstdall

由于 Bash 的进程替换中的命令是异步执行的,因此无法保证它们的输出将按照生成的顺序显示。更糟糕的是,来自标准输出和标准错误的片段很可能最终出现在同一行上。