bash中的特殊管道/重定向

时间:2012-09-11 00:15:42

标签: linux bash scripting piping

(首先,我一直在寻找一个小时,所以我很确定这不是重复)

我需要编写一个执行1个命令的脚本,1次,然后执行以下操作:

  1. 将stdout和stderr保存到文件中(同时保持正确的顺序)
  2. 仅将stderr保存到变量。
  3. 第1点的详细说明,如果我有这样的文件

    echo "one"
    thisisanerrror
    echo "two"
    thisisanotherError
    

    我应该看到输出,然后是错误,然后是输出,然后是更多的错误(因此连接是不够的)。

    我最接近的是以下内容,它似乎破坏了日志文件:

    errs=`((./someCommand.sh 2>&1 1>&3) | tee /dev/stderr ) 3>file.log 2>&3 `
    

1 个答案:

答案 0 :(得分:1)

这可能是一个起点:

How do I write stderr to a file while using "tee" with a pipe?

编辑:

这似乎有效:

((./foo.sh) 2> >(tee >(cat) >&2)) > foo.log

用tee拆分stderr,将一个副本写入stdout(cat)并将另一个写入stderr。之后,您可以获取所有标准输出并将其写入文件。

编辑:将输出存储在变量

varx=`((./foo.sh) 2> >(tee >(cat) >&2))`

我还看到了附加双引号括起来的命令,但我不知道这可能有什么好处。