【问题标题】:pipe both, stdout and stderr in the fish shell在鱼壳中管道标准输出和标准错误
【发布时间】:2016-05-30 17:01:59
【问题描述】:

我知道这一直是一个问题,并且我发现了很多关于它的讨论,但是我没有得到最终完成它的方法:管道,stdout 和 stderr。在 bash 中,这很简单:

cmd 2>&1 | cmd2

【问题讨论】:

    标签: fish


    【解决方案1】:

    该语法也适用于鱼。一个演示:

    $ function cmd1
          echo "this is stdout"
          echo "this is stderr" >&2
      end
    
    $ function cmd2
          rev
      end
    
    $ cmd1 | cmd2
    this is stderr
    tuodts si siht
    
    $ cmd1 &| cmd2
    rredts si siht
    tuodts si siht
    

    文档:https://fishshell.com/docs/current/language.html#redirects

    【讨论】:

    • 完美。原来我用的是旧版本。
    • 重定向到文件,echo meow > /tmp/meow 2>&1 适合我。你需要在 stdout 重定向之后进行 stderr 重定向。
    • 为什么在函数cmd1 中使用sh -c,而echo "this is stdout"; echo "this is stderr" >&2 可以正常工作
    【解决方案2】:

    还有一个方便的快捷方式,根据这些docs

    &>

    这是相关的引用(重点和空白,我的):

    为方便起见,重定向 &> 可用于引导两个标准输出 和 stderr 到同一个目的地。例如:

    echo hello &> all_output.txt
    

    stdoutstderr 都重定向到文件 all_output.txt。这相当于echo hello > all_output.txt 2>&1

    【讨论】:

    • 谢谢!值得注意的是,不仅仅是 stdout 和 stderr,而且所有输出 FD 似乎都被转发了。我正在为一个并行应用程序苦苦挣扎,该应用程序通过 &3 &4 等输出多个进程。&> 得到它们,这非常有帮助。
    • 在关注 S.O. 的小徽章后回到这篇文章,重读 @BoeroBoy 的评论,并意识到 &> 中的 > 很容易记住,一旦你知道它“得到他们所有”,因为它看起来像一个漏斗(或者,正如我们在小学时学到的,一条鳄鱼)吞噬了所有的输出。 ??