Linux 重定向程序输出

Linux 重定向程序输出,linux,bash,unix,Linux,Bash,Unix,我如何重定向我的程序,使输出转到3个文件,这样 stdout转到文件1 stderr转到文件2 stdout和stderr的组合结果按其原始顺序进入文件3 重定向时,程序运行时,输出也会打印到屏幕上 我试过了 myprogram > file1 2> file2 但这并不能满足3和4的要求 编辑:如果在打印消息后屏幕立即显示消息会更好。(以提高响应能力)myprogram>file12>file2&>file3;cat文件3 或者你认为猫的文件3是作弊吗 (./foo.sh >

我如何重定向我的程序,使输出转到3个文件,这样

  • stdout转到文件1
  • stderr转到文件2
  • stdout和stderr的组合结果按其原始顺序进入文件3
  • 重定向时,程序运行时,输出也会打印到屏幕上
  • 我试过了

    myprogram > file1 2> file2
    
    但这并不能满足3和4的要求


    编辑:如果在打印消息后屏幕立即显示消息会更好。(以提高响应能力)

    myprogram>file12>file2&>file3;cat文件3

    或者你认为猫的文件3是作弊吗

    (./foo.sh > >(tee out.log) 2> >(tee err.log >&2)) |& tee all.log
    
    我们在这里做了什么?首先,我们创建两个子shell来运行
    tee out.log
    tee err.log
    ,并将适当的描述符重定向到它们。我们小心地将
    stdout
    err.log
    重定向回它所属的
    stderr
    ,否则它将把
    out.log
    搞砸(这一想法归功于)。其次,我们将整个内容放在一个子shell中,这样我们可以将其
    stdout
    stderr
    一次性重定向到
    all.log
    ,再次使用
    tee
    同时打印到屏幕上


    一个警告是,我们正在运行的程序可能会在stdout不是TTY/PTY(终端设备)时缓冲它。如果您需要屏幕和文件上的
    stdout
    的即时输出,您可以尝试使用一个实用程序运行程序,该实用程序可以避免这种缓冲。

    可能与OP询问的Linux不起作用的情况相同。奇怪。我有Bash 4.1.5,你可能有一个旧版本。我有版本
    3.2.53
    。是的,Mac OS卡在一个非常旧的Bash上。