重定向stdout和stderr,同时将stderr复制到bash中的另一个文件

时间:2017-07-21 08:38:37

标签: bash io

我试图重定向一些bash脚本输出。 我想做的是:

    getAffectationsFromDataBase() {
  this.http.get('http://localhost:8081/affectation/findAll').map((response:Response) => {
        this.tasks.tasks = this.transformAffectations(response.json().affectations);
    }).subscribe(result =>  this.isLoading = false);
}

我想将stderr放在一个文件中,并将stderr和stdout放在另一个文件中。

另外我想在all_output.log的末尾添加(对于不重要的error.log)。

但我没有得到正确的语法,我一直在尝试很多事情,而且我无法找到正确的事情。

谢谢你的帮助! :)

1 个答案:

答案 0 :(得分:2)

重定向语句(如> foo2> bar1>&2)最好像从左到右执行的文件描述符赋值一样读取。您的代码执行此操作:

2> error.log

意味着:fd2 = open_for_writing('error.log')

>> all_output.log

意味着:fd1 = open_for_appending('all_output.log')

2>&1

意味着:fd2 = fd1

通过这个你可以理解第一个语句(2> error.log)除了创建(空)error.log之外没有任何效果。

您希望实现重复一个流到两个不同的目标。这不是仅通过重新定向来完成的。为此,您需要一个读取一件事并将其写入两个不同流的过程。使用tee(1)做得最好。

不幸的是,将流传递给其他进程是通过管道完成的,它们只传递stdout,而不是stderr。要实现目标,首先必须交换stderr和stdout。

完整的结果调用可能如下所示:

(./some_script.sh 3>&2 2>&1 1>&3 | tee error.log) >> all_outputlog 2>&1