我正在尝试编写一个脚本,它本质上充当由(非交互式)命令创建的所有输出的passthru日志,而不会影响命令输出到其他进程。也就是说,stdout和stderr应该看起来像是没有运行我的命令一样。
为此,我尝试将stdout和stderr分别重定向到两个不同的T恤,每个T恤用于不同的文件,然后重新组合它们,使它们仍然分别出现在stdout和stderr上。我已经看到了许多关于发球和重定向的其他问题,并且已经尝试了从那些中收集到的一些答案,但是它们似乎都没有合并将两者分成分开的三通,然后正确地重新组合它们。
我的尝试成功将输出拆分为正确的文件,但实际的stdout / stderr输出没有正确保留流。我在一个更复杂的设置中看到了这一点,所以我创建了简化的命令,我将数据回显到stdout或stderr作为我的“命令”,如下所示。
以下是我尝试过的几件事:
{ command | tee ~/tee.txt; } 2>&1 | { tee ~/tee2.txt 1>&2; }
运行我的简单测试我看到:
$ { { { echo "test" 1>&2; } | tee ~/tee.txt; } 2>&1 | { tee ~/tee2.txt 1>&2; } } > /dev/null
test
$ { { { echo "test" 1>&2; } | tee ~/tee.txt; } 2>&1 | { tee ~/tee2.txt 1>&2; } } 2> /dev/null
$
好的,这正如我所料。我正在回应stderr,所以当我只重定向stdout时,当我将最终的stderr重定向到/ dev / null和我的原始echo时,我希望看不到任何内容。
$ { { { echo "test"; } | tee ~/tee.txt; } 2>&1 | { tee ~/tee2.txt 1>&2; } } > /dev/null
test
$ { { { echo "test"; } | tee ~/tee.txt; } 2>&1 | { tee ~/tee2.txt 1>&2; } } 2> /dev/null
$
这是倒退!我的命令只将数据发送到stdout,所以当我将最终的stdout重定向到null时,我希望看不到任何内容。但事实恰恰相反。
这是我试过的第二个命令,它有点复杂:
{ command 2>&3 | tee ~/tee.txt; } 3>&1 1>&2 | { tee /home/michael/tee2.txt 1>&2; }
不幸的是,我看到了与以前相同的行为。
我无法真正看到我做错了什么,但似乎stdout在某种程度上受到了破坏。在第一个命令的情况下,我怀疑这是因为我正在组合stdout和stderr(2>&1
在我把它管道到第二个发球台之前,但是如果是这种情况我会期望在tee2.txt文件中看到stdout和stderr,我没有 - 我只看到stderr!在第二个命令的情况下,我从阅读我为此命令调整的答案的印象是描述符被交换以避免这个问题,但显然有些事情仍然是错误的。
编辑:我有另一个想法,也许第二个命令失败,因为我正在重定向 1>&2
这就是从第一个发球台杀死标准杆。所以我试着用它重定向 1>&4
然后将其重定向到最后的stdout:
{ command 2>&3 | tee ~/tee.txt; } 3>&1 1>&4 | { tee /home/michael/tee2.txt 1>&2 4>&1; }
但现在我得到:
-bash: 4: Bad file descriptor
我还尝试将描述符2重定向到最终发球台中的描述符1:
{ command 2>&3 | tee ~/tee.txt; } 3>&1 1>&2 | { tee /home/michael/tee2.txt 1>&2 2>&1; }
和:
{ command 2>&3 | tee ~/tee.txt; } 3>&1 1>&2 | { tee /home/michael/tee2.txt 1>&2; } 2>&1