代码之家  ›  专栏  ›  技术社区  ›  IMTheNachoMan

将stdout和stderr重定向到文件,将stderr重定向到屏幕,同时保留输出顺序

  •  0
  • IMTheNachoMan  · 技术社区  · 6 年前

    我想将stdout和stderr重定向到一个文件,同时保留输出顺序,然后将stderr显示到屏幕上。我看到很多问题在讨论它:

    但他们似乎没有一个人做我想做的或维护秩序。

    我的测试脚本:

    #!/bin/bash
    
    echo "1: good" >&1
    echo "2: error" >&2
    echo "3: error" >&2
    echo "4: good" >&1
    echo "5: error" >&2
    echo "6: good" >&1
    echo "7: error" >&2
    echo "8: good" >&1
    echo "9: error" >&2
    

    到目前为止我有:

    $ ./test.sh 2>&1 > output.log
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Charles Duffy    6 年前

    标准的Unix语义不允许这样做;它 不能 只使用构建在bash中或在posix中指定的工具就可以可靠地完成。

    当写操作发生在同一个目的地时,它们之间只有一个相互保证的顺序。一旦您将stdout和stderr重定向到不同的目的地, 操作系统不再提供对其执行的写入顺序的保证。 ;当这些写入操作指向单独的进程(例如 tee )然后,它必须读取内容并执行自己的进一步写入,这取决于操作系统级别的调度。

    可以使用操作系统提供(或可用于)的系统调用级跟踪工具来生成系统调用的绝对顺序,从而生成确定顺序的输出;在对 Separately redirecting and recombining stderr/stdout without losing ordering .

    然而,使用bash本身,您只能控制子进程的文件描述符连接在哪里,而不能控制写入这些描述符的内容是如何被缓冲和刷新的,因此没有足够的控制来使您所请求的内容成为可能,而不必对写入内容进行重新排序。

    推荐文章