<p>我想你还是想在终端上看到STDERR和STDOUT。你可以去找乔希·凯利的答案,但我发现在后台保留一个<code>tail</code>,它会输出你的日志文件,非常烦琐。请注意,您需要保存一个exra FD,并通过终止它来进行清理,技术上应该在<code>trap '...' EXIT</code>中这样做。</p>
<p>有更好的方法可以做到这一点,而且您已经发现了:<code>tee</code>。</p>
<p>只是,不要只把它用在stdout上,要有一个stdout的tee和一个stderr的tee。你将如何做到这一点?进程替换和文件重定向:</p>
<pre><code>command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)
</code></pre>
<p>让我们分开来解释一下:</p>
<pre><code>> >(..)
</code></pre>
<p><code>>(...)</code>(进程替换)创建一个FIFO并让<code>tee</code>监听它。然后,它使用<code>></code>(文件重定向)将<code>command</code>的STDOUT重定向到第一个<code>tee</code>正在侦听的FIFO。</p>
<p>同样的第二件事:</p>
<pre><code>2> >(tee -a stderr.log >&2)
</code></pre>
<p>我们再次使用进程替换来生成<code>tee</code>进程,该进程从STDIN读取并将其转储到<code>stderr.log</code>。<code>tee</code>将它的输入输出回STDOUT,但是由于它的输入是我们的STDERR,我们想再次将<code>tee</code>的STDOUT重定向到我们的STDERR。然后我们使用文件重定向将<code>command</code>的STDERR重定向到FIFO的输入(<code>tee</code>的STDIN)。</p>
<p>见<a href="http://mywiki.wooledge.org/BashGuide/InputAndOutput" rel="noreferrer">http://mywiki.wooledge.org/BashGuide/InputAndOutput</a></p>
<p>进程替换是那些非常可爱的东西之一,你可以选择<code>bash</code>作为外壳,而不是<code>sh</code>(POSIX或Bourne)。</p>
<hr/>
<p>在<code>sh</code>中,您必须手动执行以下操作:</p>
<pre><code>out="${TMPDIR:-/tmp}/out.$$" err="${TMPDIR:-/tmp}/err.$$"
mkfifo "$out" "$err"
trap 'rm "$out" "$err"' EXIT
tee -a stdout.log < "$out" &
tee -a stderr.log < "$err" >&2 &
command >"$out" 2>"$err"
</code></pre>